B °-_4)ã@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__..)ÚAssertionErrorÚ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.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)r7r rr"r r!rrÚgetr rÚsentinelÚ _sentinelr$r&r(r r.)rrrrÚstartes   zBaseProcess.startcCs| ¡|j ¡dS)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)r7r Ú terminate)rrrrr=wszBaseProcess.terminatecCs| ¡|j ¡dS)zT Terminate process; sends SIGKILL signal or uses TerminateProcess() N)r7r Úkill)rrrrr>~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) r7r"r r!rr Úwaitr r)rZtimeoutZresrrrr+…s  zBaseProcess.joincCs`| ¡|tkrdS|jt ¡ks*tdƒ‚|jdkr8dS|j ¡}|dkrNdSt  |¡dSdS)z1 Return whether process is alive Tzcan only test a child processNF) r7rr"r r!rr 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 r6Úcloser;r rr#)rrrrrB£s   zBaseProcess.closecCs|jS)N)r,)rrrrr1´szBaseProcess.namecCst|tƒstdƒ‚||_dS)Nzname must be a string)Ú isinstancerrr,)rr1rrrr1¸scCs|j dd¡S)z4 Return whether process is a daemon rF)rr9)rrrrr½szBaseProcess.daemoncCs |jdkstdƒ‚||jd<dS)z1 Set whether process is a daemon Nzprocess has already startedr)r rr)rZdaemonicrrrrÄscCs |jdS)NÚauthkey)r)rrrrrDÌszBaseProcess.authkeycCst|ƒ|jd<dS)z2 Set authorization key of process rDN)ÚAuthenticationStringr)rrDrrrrDÐscCs"| ¡|jdkr|jS|j ¡S)zM Return exit code of process or `None` if it has yet to stop N)r7r 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)r7rr r!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)r7r;ÚAttributeErrorr6)rrrrr:î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"r r!r r rFr)ÚintÚ_exitcode_to_namer9r*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) rMrRrSZ _start_methodZ_force_start_methodÚ itertoolsr4rÚsetr Z _close_stdinrZ_finalizer_registryÚclearZ_run_after_forkersÚinfor8Z_exit_functionÚ SystemExitr2rCrNÚsysÚstderrÚwriterÚ tracebackr1Ú print_excÚ threadingZ _shutdownZ_flush_std_streams)rrRrSZ old_processrFÚer]rrrÚ _bootstrapsD        zBaseProcess._bootstrap)N)r*Ú __module__Ú __qualname__Ú__doc__rr5r7r8r<r=r>r+rArBÚpropertyr1ÚsetterrrDrFrHrGr:rPrarrrrr?s0       c@seZdZdd„ZdS)rEcCs,ddlm}|ƒdkrtdƒ‚tt|ƒffS)NrQ)Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rSrgÚ TypeErrorrEÚbytes)rrgrrrÚ __reduce__Fs   zAuthenticationString.__reduce__N)r*rbrcrjrrrrrEEsrEc@seZdZdd„Zdd„ZdS)Ú _MainProcesscCs8d|_d|_d|_d|_d|_tt d¡ƒddœ|_dS)NrZ MainProcessFé z/mp)rDZ semprefix) rr,r"r r#rEr Úurandomr)rrrrr5Us z_MainProcess.__init__cCsdS)Nr)rrrrrBgsz_MainProcess.closeN)r*rbrcr5rBrrrrrkSsrkrQéZSIGÚ_)!Ú__all__r rZÚsignalrUr_Z _weakrefsetrÚpathÚabspathÚgetcwdZ ORIGINAL_DIRÚOSErrorrrr ÚobjectrrirErkrr4rrVr rOr Ú__dict__Úitemsr1Zsignumr-rrrrÚ s6