3 \û#ã @sdddgZddlZddlZddlZddlZddlmZyejjej ƒƒZ Wne k rbdZ YnXdd„Z dd„Z dd „ZGd d„deƒZGd d „d eƒZGd d„deƒZeƒaejdƒaeƒa[iZxSsz'BaseProcess.__init__..)ÚAssertionErrorÚnextÚ_process_counterrÚ _identityÚ_configÚcopyÚosÚgetpidÚ _parent_pidr Ú_targetÚtupleÚ_argsÚdictÚ_kwargsÚtypeÚ__name__ÚjoinÚ_namerÚ _danglingÚadd)rÚgroupÚtargetÚnameÚargsÚkwargsrÚcountrrrÚ__init__Gs    zBaseProcess.__init__cCs|jr|j|j|jŽdS)zQ Method to be run in sub-process; can be overridden in sub-class N)r#r%r')rrrrÚrunXszBaseProcess.runcCst|jdkstdƒ‚|jtjƒks(tdƒ‚tjjdƒ s>tdƒ‚tƒ|j |ƒ|_|jj |_ |` |` |`tj|ƒ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 rr"r r!rrÚgetr rÚsentinelÚ _sentinelr#r%r'r r-)rrrrÚstart_s   zBaseProcess.startcCs|jjƒdS)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)r Ú terminate)rrrrr:pszBaseProcess.terminatecCsJ|jtjƒkstdƒ‚|jdk s(tdƒ‚|jj|ƒ}|dk rFtj|ƒdS)z5 Wait until child process terminates zcan only join a child processNzcan only join a started process)r"r r!rr Úwaitr r)rZtimeoutÚresrrrr*vs  zBaseProcess.joincCsX|tkr dS|jtjƒks"tdƒ‚|jdkr0dS|jjƒ}|dkrFdStj|ƒdSdS)z1 Return whether process is alive Tzcan only test a child processNF) rr"r r!rr r r r)rÚ returncoderrrÚis_alive€s   zBaseProcess.is_alivecCs|jS)N)r+)rrrrr0’szBaseProcess.namecCst|tƒstdƒ‚||_dS)Nzname must be a string)Ú isinstancerrr+)rr0rrrr0–scCs|jjddƒS)z4 Return whether process is a daemon rF)rr6)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)rrrrr@ªszBaseProcess.authkeycCst|ƒ|jd<dS)z2 Set authorization key of process r@N)ÚAuthenticationStringr)rr@rrrr@®scCs|jdkr|jS|jjƒS)zM Return exit code of process or `None` if it has yet to stop N)r r )rrrrÚexitcodeµs zBaseProcess.exitcodecCs"|tkrtjƒS|jo|jjSdS)zU Return identifier (PID) of process or `None` if it has yet to start N)rr r!r Úpid)rrrrÚident¾szBaseProcess.identc Cs(y|jStk r"tdƒ‚YnXdS)z{ Return a file descriptor (Unix) or handle (Windows) suitable for waiting for process termination. zprocess not startedN)r8ÚAttributeErrorÚ ValueError)rrrrr7ÊszBaseProcess.sentinelcCs˜|tkrd}n>|jtjƒkr"d}n*|jdkr2d}n|jjƒdk rH|j}nd}t|ƒtkrv|dkrfd}ndt j ||ƒ}dt|ƒj |j ||j r�dp’d fS) NZstartedÚunknownÚinitialrZstoppedz stopped[%s]z<%s(%s, %s%s)>z daemonÚ)rr"r r!r r rBr(ÚintÚ_exitcode_to_namer6r)r+r)rZstatusrrrÚ__repr__Õs  zBaseProcess.__repr__c CsJddlm}m}�zy||jdk r,|j|jƒtjdƒatƒa |j ƒt }|a z|j j ƒ|jƒWd~X|jdƒz|jƒd}Wd|jƒXWn˜tk rø}zL|js®d}n:t|jdtƒrÊ|jd}ntjjt|jdƒdƒd}WYdd}~Xn2d}ddl}tjjd|jƒ|jƒYnXWd|jd|ƒ|jƒX|S)Né)ÚutilÚcontextz child process calling self.run()rÚ z Process %s: z process exiting with exitcode %d)rIrNrOZ _start_methodZ_force_start_methodÚ itertoolsr3rÚsetr Z _close_stdinrZ_finalizer_registryÚclearZ_run_after_forkersÚinfor5Z_exit_functionÚ SystemExitr1r?rJÚsysÚstderrÚwriterÚ tracebackr0Ú print_excZ_flush_std_streams)rrNrOZ old_processrBÚerYrrrÚ _bootstrapísB        zBaseProcess._bootstrap)N)r)Ú __module__Ú __qualname__Ú__doc__rr4r5r9r:r*r>Úpropertyr0Úsetterrr@rBrDrCr7rLr\rrrrr>s*       c@seZdZdd„ZdS)rAcCs,ddlm}|ƒdkrtdƒ‚tt|ƒffS)NrM)Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)rOrbÚ TypeErrorrAÚbytes)rrbrrrÚ __reduce__s   zAuthenticationString.__reduce__N)r)r]r^rerrrrrAsrAc@seZdZdd„ZdS)Ú _MainProcesscCs2f|_d|_d|_d|_ttjdƒƒddœ|_dS)NZ MainProcessé z/mp)r@Z semprefix)rr+r"r rAr Úurandomr)rrrrr4-s  z_MainProcess.__init__N)r)r]r^r4rrrrrf+srfrMéZSIGÚ_) Ú__all__r rVÚsignalrQÚ _weakrefsetrÚpathÚabspathÚgetcwdZ ORIGINAL_DIRÚOSErrorrrr ÚobjectrrdrArfrr3rrRr rKr Ú__dict__Úitemsr0Zsignumr,rrrrÚ s2     `