B ©íïE¼"ã@sdddgZddlZddlZddlZddlZddlZddlmZyej  e  ¡¡Z Wne k rjdZ YnXdd„Z dd„Zdd „ZGd d„deƒZGd d „d eƒZGd d„deƒZeƒae d¡aeƒa[iZxUsz'BaseProcess.__init__..)ÚnextÚ_process_counterrÚ _identityÚ_configÚcopyÚosÚgetpidÚ _parent_pidr Ú_closedÚ_targetÚtupleÚ_argsÚdictÚ_kwargsÚtypeÚ__name__ÚjoinÚ_namerÚ _danglingÚadd)rÚgroupÚtargetÚnameÚargsÚkwargsrÚcountrrrÚ__init__Hs    zBaseProcess.__init__cCs|jrtdƒ‚dS)Nzprocess object is closed)r"Ú ValueError)rrrrÚ _check_closedZszBaseProcess._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Úrun^szBaseProcess.runcCs>| ¡tƒ| |¡|_|jj|_|`|`|`t   |¡dS)z% Start child process N) r6r rr ÚsentinelÚ _sentinelr#r%r'r r-)rrrrÚstartes    zBaseProcess.startcCs| ¡|j ¡dS)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)r6r Ú terminate)rrrrr;wszBaseProcess.terminatecCs| ¡|j ¡dS)zT Terminate process; sends SIGKILL signal or uses TerminateProcess() N)r6r Úkill)rrrrr<~szBaseProcess.killcCs*| ¡|j |¡}|dk r&t |¡dS)z5 Wait until child process terminates N)r6r Úwaitr r)rZtimeoutZresrrrr*…s zBaseProcess.joincCsJ| ¡|tkrdS|jdkr"dS|j ¡}|dkr8dSt |¡dSdS)z1 Return whether process is alive TNF)r6rr r r r)rÚ returncoderrrÚis_alives   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)r r r5Úcloser9r rr")rrrrr@£s   zBaseProcess.closecCs|jS)N)r+)rrrrr0´szBaseProcess.namecCs ||_dS)N)r+)rr0rrrr0¸scCs|j dd¡S)z4 Return whether process is a daemon rF)rÚget)rrrrr½szBaseProcess.daemoncCs||jd<dS)z1 Set whether process is a daemon rN)r)rZdaemonicrrrrÄscCs |jdS)NÚauthkey)r)rrrrrBÌszBaseProcess.authkeycCst|ƒ|jd<dS)z2 Set authorization key of process rBN)ÚAuthenticationStringr)rrBrrrrBÐscCs"| ¡|jdkr|jS|j ¡S)zM Return exit code of process or `None` if it has yet to stop N)r6r r )rrrrÚexitcode×s zBaseProcess.exitcodecCs*| ¡|tkrt ¡S|jo$|jjSdS)zU Return identifier (PID) of process or `None` if it has yet to start N)r6rrr r Úpid)rrrrÚidentászBaseProcess.identcCs2| ¡y|jStk r,tdƒd‚YnXdS)z{ Return a file descriptor (Unix) or handle (Windows) suitable for waiting for process termination. zprocess not startedN)r6r9ÚAttributeErrorr5)rrrrr8îs zBaseProcess.sentinelcCs¤|tkrd}nJ|jrd}n>|jt ¡kr.d}n*|jdkr>d}n|j ¡dk rT|j}nd}t|ƒt kr‚|dkrrd}ndt   ||¡}dt|ƒj |j ||jrœd pžd fS) NZstartedÚclosedÚunknownÚinitialrZstoppedz stopped[%s]z<%s(%s, %s%s)>z daemonÚ)rr"r!rr r r rDr(ÚintÚ_exitcode_to_namerAr)r+r)rZstatusrrrÚ__repr__ús"  zBaseProcess.__repr__c CsRddlm}m}zy||jdk r,| |j¡t d¡atƒa |  ¡t }|a z|j   ¡| ¡Wd~X| d¡z| ¡d}Wd| ¡XWn˜tk rø}zJ|js®d}n:t|jdtƒrÊ|jd}ntj t|jdƒd¡d}Wdd}~XYn2d}ddl}tj d|j¡| ¡YnXWdt ¡| d|¡| ¡X|S)Né)ÚutilÚcontextz child process calling self.run()rÚ z Process %s: z process exiting with exitcode %d) rKrPrQZ _start_methodZ_force_start_methodÚ itertoolsr3rÚsetr Z _close_stdinrZ_finalizer_registryÚclearZ_run_after_forkersÚinfor7Z_exit_functionÚ SystemExitr1Ú isinstancerLÚsysÚstderrÚwriterÚ tracebackr0Ú print_excÚ threadingZ _shutdownZ_flush_std_streams)rrPrQZ old_processrDÚer\rrrÚ _bootstrapsD        zBaseProcess._bootstrap)N)r)Ú __module__Ú __qualname__Ú__doc__rr4r6r7r:r;r<r*r?r@Úpropertyr0ÚsetterrrBrDrFrEr8rNr`rrrrr?s0       c@seZdZdd„ZdS)rCcCs,ddlm}|ƒdkrtdƒ‚tt|ƒffS)NrO)Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rQrfÚ TypeErrorrCÚbytes)rrfrrrÚ __reduce__Fs   zAuthenticationString.__reduce__N)r)rarbrirrrrrCEsrCc@seZdZdd„Zdd„ZdS)Ú _MainProcesscCs8d|_d|_d|_d|_d|_tt d¡ƒddœ|_dS)NrZ MainProcessFé z/mp)rBZ semprefix) rr+r!r r"rCrÚurandomr)rrrrr4Us z_MainProcess.__init__cCsdS)Nr)rrrrr@gsz_MainProcess.closeN)r)rarbr4r@rrrrrjSsrjrOéZSIGÚ_)!Ú__all__rrYÚsignalrSr^Z _weakrefsetrÚpathÚabspathÚgetcwdZ ORIGINAL_DIRÚOSErrorrrr ÚobjectrrhrCrjrr3rrTr rMr Ú__dict__Úitemsr0Zsignumr,rrrrÚ s6