U Æ:âeå.ã@s8ddddgZddlZddlZddlZddlZddlZddlmZzej  e  ¡¡Z Wne k rldZ YnXdd„Z dd„Zd d„Zd d „ZGd d„deƒZGd d„deƒZGdd„deƒZGdd„deƒZdaeƒae d¡aeƒa[iZeej  ¡ƒD]0\Z!Z"e!dd…dkrüde!krüde!›ee" <qüeƒZ#dS)Ú BaseProcessÚcurrent_processÚactive_childrenÚparent_processéN)ÚWeakSetcCstS)z@ Return process object representing the current process )Ú_current_process©rrú^sz'BaseProcess.__init__..)ÚAssertionErrorÚnextÚ_process_counterrÚ _identityÚ_configÚcopyÚosÚgetpidÚ _parent_pidÚnameÚ _parent_namerÚ_closedÚ_targetÚtupleÚ_argsÚdictÚ_kwargsÚtypeÚ__name__ÚjoinÚ_namerÚ _danglingÚadd)rÚgroupÚtargetr'ÚargsÚkwargsrÚcountrrr Ú__init__Ps"    ÿzBaseProcess.__init__cCs|jrtdƒ‚dS)Nzprocess object is closed)r)Ú ValueErrorrrrr Ú _check_closedcszBaseProcess._check_closedcCs|jr|j|j|jŽdS)zQ Method to be run in sub-process; can be overridden in sub-class N)r*r,r.rrrr ÚrungszBaseProcess.runcCsz| ¡|jdkstdƒ‚|jt ¡ks0tdƒ‚tj d¡rDtdƒ‚t ƒ|  |¡|_|jj |_ |` |`|`t |¡dS)z% Start child process Nzcannot start a process twicez:can only start a process object created by current processrz3daemonic processes are not allowed to have children)r<rrr&r$r%rr"Úgetr rÚsentinelÚ _sentinelr*r,r.r r4rrrr Ústartnsÿÿ   zBaseProcess.startcCs| ¡|j ¡dS)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)r<rÚ terminaterrrr rB€szBaseProcess.terminatecCs| ¡|j ¡dS)zT Terminate process; sends SIGKILL signal or uses TerminateProcess() N)r<rÚkillrrrr rC‡szBaseProcess.killcCsR| ¡|jt ¡kstdƒ‚|jdk s0tdƒ‚|j |¡}|dk rNt |¡dS)z5 Wait until child process terminates zcan only join a child processNzcan only join a started process) r<r&r$r%rrÚwaitr r)rÚtimeoutÚresrrr r1Žs  zBaseProcess.joincCs`| ¡|tkrdS|jt ¡ks*tdƒ‚|jdkr8dS|j ¡}|dkrNdSt  |¡dSdS)z1 Return whether process is alive Tzcan only test a child processNF) r<rr&r$r%rrrr r)rÚ returncoderrr Úis_alive™s   zBaseProcess.is_alivecCsH|jdk r>|j ¡dkr tdƒ‚|j ¡d|_|`t |¡d|_dS)z Close the Process object. This method releases resources held by the Process object. It is an error to call this method if the child process is still running. Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)rrr;Úcloser@r rr)rrrr rI¬s   zBaseProcess.closecCs|jSr)r2rrrr r'½szBaseProcess.namecCst|tƒstdƒ‚||_dS)Nzname must be a string)Ú isinstancerrr2)rr'rrr r'ÁscCs|j dd¡S)z4 Return whether process is a daemon rF)r"r>rrrr rÆszBaseProcess.daemoncCs |jdkstdƒ‚||jd<dS)z1 Set whether process is a daemon Nzprocess has already startedr)rrr")rÚdaemonicrrr rÍscCs |jdS)NÚauthkey)r"rrrr rLÕszBaseProcess.authkeycCst|ƒ|jd<dS)z2 Set authorization key of process rLN)ÚAuthenticationStringr")rrLrrr rLÙscCs"| ¡|jdkr|jS|j ¡S)zM Return exit code of process or `None` if it has yet to stop N)r<rrrrrr Úexitcodeàs zBaseProcess.exitcodecCs*| ¡|tkrt ¡S|jo$|jjSdS)zU Return identifier (PID) of process or `None` if it has yet to start N)r<rr$r%rÚpidrrrr ÚidentêszBaseProcess.identcCs4| ¡z|jWStk r.tdƒd‚YnXdS)z{ Return a file descriptor (Unix) or handle (Windows) suitable for waiting for process termination. zprocess not startedN)r<r@ÚAttributeErrorr;rrrr r?÷s zBaseProcess.sentinelcCsèd}|tkrd}nL|jrd}n@|jt ¡kr2d}n,|jdkrBd}n|j ¡}|dk rZd}nd}t|ƒjd|j g}|jdk rŽ|  d|jj ¡|  d|j¡|  |¡|dk rÊt   ||¡}|  d |¡|jrÚ|  d ¡d d  |¡S) NÚstartedÚclosedÚunknownÚinitialÚstoppedzname=%rzpid=%sz parent=%sz exitcode=%srz<%s>ú )rr)r&r$r%rrr/r0r2ÚappendrOÚ_exitcode_to_namer>rr1)rrNÚstatusÚinforrr Ú__repr__s0      zBaseProcess.__repr__c Csvddlm}m}z>zž|jdk r,| |j¡t   d¡a t ƒa | ¡t}|at|j|j|ƒatjrnt ¡ ¡z|j ¡| ¡W5~X| d¡z| ¡d}W5| ¡XWnštk r}zJ|jsÒd}n:t|jdtƒrî|jd}nt j! "t#|jdƒd¡d}W5d}~XYn2d}ddl$}t j! "d|j%¡| &¡YnXW5t ¡| d|¡| ¡X|S)Né)ÚutilÚcontextz process exiting with exitcode %dz child process calling self.run()rÚ z Process %s: )'Úr^r_Ú threadingÚ _shutdownr[Ú_flush_std_streamsÚ _start_methodÚ_force_start_methodÚ itertoolsr9r Úsetr Ú _close_stdinrÚ_ParentProcessr(r&r Ú_HAVE_THREAD_NATIVE_IDÚ main_threadÚ_set_native_idÚ_finalizer_registryÚclearÚ_run_after_forkersÚ_exit_functionr=Ú SystemExitr7rJÚintÚsysÚstderrÚwriterÚ tracebackr'Ú print_exc)rÚparent_sentinelr^r_rNÚ old_processÚerwrrr Ú _bootstrap"sR   ÿ      zBaseProcess._bootstrap)N)N)r0Ú __module__Ú __qualname__Ú__doc__rr:r<r=rArBrCr1rHrIÚpropertyr'ÚsetterrrLrNrPrOr?r\r|rrrr rGsD ÿ           c@seZdZdd„ZdS)rMcCs,ddlm}|ƒdkrtdƒ‚tt|ƒffS)Nr])Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r_r‚Ú TypeErrorrMÚbytes)rr‚rrr Ú __reduce__Xs   ÿzAuthenticationString.__reduce__N)r0r}r~r…rrrr rMWsrMc@s6eZdZdd„Zdd„Zedd„ƒZd dd „ZeZdS) rjcCs4d|_||_||_d|_d|_d|_||_i|_dS)NrF)r!r2Ú_pidr&rr)r@r")rr'rOr?rrr r:hsz_ParentProcess.__init__cCsddlm}||jgdd S)Nr©rD©rE©Úmultiprocessing.connectionrDr@)rrDrrr rHrs z_ParentProcess.is_alivecCs|jSr)r†rrrr rPvsz_ParentProcess.identNcCs ddlm}||jg|ddS)z6 Wait until parent process terminates rr‡rˆNr‰)rrErDrrr r1zs z_ParentProcess.join)N) r0r}r~r:rHr€rPr1rOrrrr rjfs    rjc@seZdZdd„Zdd„ZdS)Ú _MainProcesscCs8d|_d|_d|_d|_d|_tt d¡ƒddœ|_dS)NrÚ MainProcessFé z/mp)rLÚ semprefix) r!r2r&rr)rMr$Úurandomr"rrrr r:‰s ÿz_MainProcess.__init__cCsdSrrrrrr rI›sz_MainProcess.closeN)r0r}r~r:rIrrrr r‹‡sr‹r]éZSIGÚ_r)$Ú__all__r$rtÚsignalrgrbÚ _weakrefsetrÚpathÚabspathÚgetcwdÚ ORIGINAL_DIRÚOSErrorrrrr Úobjectrr„rMrjr‹r rr9r rhr rYr Ú__dict__Úitemsr'Úsignumr3rrrr Ú s@ÿ    !