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©N)Ú_current_process©r r ú^sz'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Úcountr r r Ú__init__Ps     ÿzBaseProcess.__init__cCs|jrtdƒ‚dS)Nzprocess object is closed)r(Ú ValueErrorrr r r Ú _check_closedcszBaseProcess._check_closedcCs|jr|j|j|jŽdSr)r)r+r-rr r r ÚrungszBaseProcess.runcCs>| ¡tƒ| |¡|_|jj|_|`|`|`t   |¡dSr) r;r rrÚsentinelÚ _sentinelr)r+r-r r3rr r r Ústartns    zBaseProcess.startcCs| ¡|j ¡dSr)r;rÚ terminaterr r r r@€szBaseProcess.terminatecCs| ¡|j ¡dSr)r;rÚkillrr r r rA‡szBaseProcess.killcCs*| ¡|j |¡}|dk r&t |¡dSr)r;rÚwaitr r)rÚtimeoutÚresr r r r0Žs zBaseProcess.joincCsJ| ¡|tkrdS|jdkr"dS|j ¡}|dkr8dSt |¡dSdS)NTF)r;rrrr r)rÚ returncoder r r Úis_alive™s   zBaseProcess.is_alivecCsH|jdk r>|j ¡dkr tdƒ‚|j ¡d|_|`t |¡d|_dS)Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)rrr:Úcloser>r rr(rr r r rG¬s   zBaseProcess.closecCs|jSr©r1rr r r r&½szBaseProcess.namecCs ||_dSrrH)rr&r r r r&ÁscCs|j dd¡S)NrF)r!Úgetrr r r rÆszBaseProcess.daemoncCs||jd<dS)Nr©r!)rÚdaemonicr r r rÍscCs |jdS©NÚauthkeyrJrr r r rMÕszBaseProcess.authkeycCst|ƒ|jd<dSrL)ÚAuthenticationStringr!)rrMr r r rMÙscCs"| ¡|jdkr|jS|j ¡Sr)r;rrrr r r Úexitcodeàs zBaseProcess.exitcodecCs*| ¡|tkrt ¡S|jo$|jjSdSr)r;rr#r$rÚpidrr r r ÚidentêszBaseProcess.identcCs4| ¡z|jWStk r.tdƒd‚YnXdS)Nzprocess not started)r;r>ÚAttributeErrorr:rr r r 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.r/r1ÚappendrPÚ_exitcode_to_namerIrr0)rrOÚstatusÚinfor r r Ú__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Ú itertoolsr8rÚsetr Ú _close_stdinrÚ_ParentProcessr'r%rÚ_HAVE_THREAD_NATIVE_IDÚ main_threadÚ_set_native_idÚ_finalizer_registryÚclearÚ_run_after_forkersÚ_exit_functionr<Ú SystemExitr6Ú isinstanceÚintÚsysÚstderrÚwriterÚ tracebackr&Ú print_exc)rÚparent_sentinelr_r`rOÚ old_processÚeryr r r Ú _bootstrap"sR   ÿ      zBaseProcess._bootstrap)N)N)r/Ú __module__Ú __qualname__rr9r;r<r?r@rAr0rFrGÚpropertyr&ÚsetterrrMrOrQrPr=r]r~r r r r rGsB ÿ           c@seZdZdd„ZdS)rNcCs,ddlm}|ƒdkrtdƒ‚tt|ƒffS)Nr^)Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r`rƒÚ TypeErrorrNÚbytes)rrƒr r r Ú __reduce__Xs   ÿzAuthenticationString.__reduce__N)r/rr€r†r r r r rNWsrNc@s6eZdZdd„Zdd„Zedd„ƒZd dd „ZeZdS) rkcCs4d|_||_||_d|_d|_d|_||_i|_dS)Nr F)r r1Ú_pidr%rr(r>r!)rr&rPr=r r r r9hsz_ParentProcess.__init__cCsddlm}||jgdd S©Nr)rB)rC©Úmultiprocessing.connectionrBr>)rrBr r r rFrs z_ParentProcess.is_alivecCs|jSr)r‡rr r r rQvsz_ParentProcess.identNcCs ddlm}||jg|ddSrˆr‰)rrCrBr r r r0zs z_ParentProcess.join)N) r/rr€r9rFrrQr0rPr r r r rkfs    rkc@seZdZdd„Zdd„ZdS)Ú _MainProcesscCs8d|_d|_d|_d|_d|_tt d¡ƒddœ|_dS)Nr Ú MainProcessFé z/mp)rMÚ semprefix) r r1r%rr(rNr#Úurandomr!rr r r r9‰s ÿz_MainProcess.__init__cCsdSrr rr r r rG›sz_MainProcess.closeN)r/rr€r9rGr r r r r‹‡sr‹r^éZSIGÚ_r)$Ú__all__r#rvÚsignalrhrcÚ _weakrefsetrÚpathÚabspathÚgetcwdÚ ORIGINAL_DIRÚOSErrorrrrr Úobjectrr…rNrkr‹rrr8rrir rZr Ú__dict__Úitemsr&Úsignumr2r r r r Ú s@ÿ    !