a XC?hà.ã@s2gd¢ZddlZddlZddlZddlZddlZddlmZzej  e  ¡¡Z Wne yfdZ Yn0dd„Z dd„Zdd „Zd d „ZGd d „d eƒZGdd„deƒZGdd„deƒZGdd„deƒZdaeƒae d¡aeƒa[iZeej  ¡ƒD]0\Z!Z"e!dd…dkröde!vrö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ú^óz'BaseProcess.__init__..)Ú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|ji|j¤ŽdS)zQ Method to be run in sub-process; can be overridden in sub-class N)r*r,r.rrrr ÚrungszBaseProcess.runcCs>| ¡tƒ| |¡|_|jj|_|`|`|`t   |¡dS)z% Start child process N) r<r rrÚsentinelÚ _sentinelr*r,r.r r4rrrr Ústartns    zBaseProcess.startcCs| ¡|j ¡dS)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)r<rÚ terminaterrrr rA€szBaseProcess.terminatecCs| ¡|j ¡dS)zT Terminate process; sends SIGKILL signal or uses TerminateProcess() N)r<rÚkillrrrr rB‡szBaseProcess.killcCs*| ¡|j |¡}|dur&t |¡dS)z5 Wait until child process terminates N)r<rÚwaitr r)rÚtimeoutÚresrrr r1Žs zBaseProcess.joincCsJ| ¡|turdS|jdur"dS|j ¡}|dur8dSt |¡dSdS)z1 Return whether process is alive TNF)r<rrrr r)rÚ returncoderrr Úis_alive™s   zBaseProcess.is_alivecCsH|jdur>|j ¡dur 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 rH¬s   zBaseProcess.closecCs|jSr©r2rrrr r'½szBaseProcess.namecCs ||_dSrrI)rr'rrr r'ÁscCs|j dd¡S)z4 Return whether process is a daemon rF)r"Úgetrrrr rÆszBaseProcess.daemoncCs||jd<dS)z1 Set whether process is a daemon rN©r")rZdaemonicrrr rÍscCs |jdS)NÚauthkeyrKrrrr rLÕszBaseProcess.authkeycCst|ƒ|jd<dS)z2 Set authorization key of process rLN)ÚAuthenticationStringr")rrLrrr rLÙscCs"| ¡|jdur|jS|j ¡S)zM Return exit code of process or `None` if it has yet to stop N)r<rrrrrr Úexitcodeàs zBaseProcess.exitcodecCs*| ¡|turt ¡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.identcCs2| ¡z|jWSty,tdƒd‚Yn0dS)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}|turd}nL|jrd}n@|jt ¡kr2d}n,|jdurBd}n|j ¡}|durZd}nd}t|ƒjd|j g}|jdurŽ|  d|jj ¡|  d|j¡|  |¡|durÊt   ||¡}|  d |¡|jrÚ|  d ¡d d  |¡S) NZstartedÚclosedÚunknownÚinitialZstoppedzname=%rzpid=%sz parent=%sz exitcode=%srz<%s>ú )rr)r&r$r%rrr/r0r2ÚappendrOÚ_exitcode_to_namerJrr1)rrNZstatusÚinforrr Ú__repr__s0      zBaseProcess.__repr__c Cs˜ddlm}m}z`z¨|jdur,| |j¡t d¡atƒa |  ¡t }|a t |j |j|ƒatjrnt ¡ ¡z|j ¡| ¡W~n~0| d¡z| ¡d}W| ¡n | ¡0Wn”ty }zJ|jdurÞd}n.t|jtƒrò|j}ntj  t!|jƒd¡d}WYd}~n:d}~0d}ddl"}tj  d|j#¡| $¡Yn0Wt %¡| d|¡| &¡n t %¡| d|¡| &¡0|S)Né)ÚutilÚcontextz child process calling self.run()rÚ z Process %s: z process exiting with exitcode %d)'Úr[r\Z _start_methodZ_force_start_methodÚ itertoolsr9r Úsetr Z _close_stdinrÚ_ParentProcessr(r&r Ú threadingZ_HAVE_THREAD_NATIVE_IDZ main_threadZ_set_native_idZ_finalizer_registryÚclearZ_run_after_forkersrXr=Z_exit_functionÚ SystemExitÚcodeÚ isinstanceÚintÚsysÚstderrÚwriterÚ tracebackr'Ú print_excZ _shutdownZ_flush_std_streams)rZparent_sentinelr[r\Z old_processrNÚerkrrr Ú _bootstrap"sT    ÿ       þ zBaseProcess._bootstrap)N)N)r0Ú __module__Ú __qualname__Ú__doc__rr:r<r=r@rArBr1rGrHÚpropertyr'ÚsetterrrLrNrPrOr>rYrnrrrr rGsD ÿ           rc@seZdZdd„ZdS)rMcCs,ddlm}|ƒdurtdƒ‚tt|ƒffS)NrZ)Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r\rtÚ TypeErrorrMÚbytes)rrtrrr Ú __reduce__Xs   ÿzAuthenticationString.__reduce__N)r0rorprwrrrr rMWsrMc@s6eZdZdd„Zdd„Zedd„ƒZd dd „ZeZdS) racCs4d|_||_||_d|_d|_d|_||_i|_dS)NrF)r!r2Ú_pidr&rr)r?r")rr'rOr>rrr r:hsz_ParentProcess.__init__cCsddlm}||jgdd S)Nr©rC©rD©Zmultiprocessing.connectionrCr?)rrCrrr rGrs z_ParentProcess.is_alivecCs|jSr)rxrrrr rPvsz_ParentProcess.identNcCs ddlm}||jg|ddS)z6 Wait until parent process terminates rryrzNr{)rrDrCrrr r1zs z_ParentProcess.join)N) r0rorpr:rGrrrPr1rOrrrr rafs    rac@seZdZdd„Zdd„ZdS)Ú _MainProcesscCs8d|_d|_d|_d|_d|_tt d¡ƒddœ|_dS)NrZ MainProcessFé z/mp)rLZ semprefix) r!r2r&rr)rMr$Úurandomr"rrrr r:‰s ÿz_MainProcess.__init__cCsdSrrrrrr rH›sz_MainProcess.closeN)r0rorpr:rHrrrr r|‡sr|rZéZSIGÚ_r)$Ú__all__r$rhÚsignalr_rbZ _weakrefsetrÚpathÚabspathÚgetcwdZ ORIGINAL_DIRÚOSErrorrrrr ÚobjectrrvrMrar|r rr9r r`r rWr Ú__dict__Úitemsr'Zsignumr3rrrr Ú s<     !