U e5då.ã@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)z@ Return process object representing the current process )Ú_current_process©rrú//usr/lib64/python3.8/multiprocessing/process.pyr%scCstƒttƒS)zN Return list of process objects corresponding to live child processes )Ú_cleanupÚlistÚ _childrenrrrr r+scCstS)z? Return process object representing the parent process )Ú_parent_processrrrr r3scCs*ttƒD]}|j ¡dk rt |¡qdS©N)r r Ú_popenÚpollÚdiscard)Úprrr r =s r c@süeZdZdZdd„Zddddifddœdd„Zd d „Zd d „Zd d„Zdd„Z dd„Z d,dd„Z dd„Z dd„Z edd„ƒZejdd„ƒZedd„ƒZejdd„ƒZedd „ƒZejd!d „ƒZed"d#„ƒZed$d%„ƒZeZed&d'„ƒZd(d)„Zd-d*d+„ZdS).rz€ Process objects represent activity that is run in a separate process The class is analogous to `threading.Thread` cCst‚dSr)ÚNotImplementedError©Úselfrrr Ú_PopenMszBaseProcess._PopenNr)ÚdaemoncCs ttƒ}tj|f|_tj ¡|_t ¡|_tj |_ d|_ d|_ ||_ t|ƒ|_t|ƒ|_|p€t|ƒjdd dd„|jDƒ¡|_|dk r’||_t |¡dS)NFú-ú:css|]}t|ƒVqdSr)Ústr)Ú.0Úirrr Ú ^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Úcountrrr Ú__init__Ps     ÿzBaseProcess.__init__cCs|jrtdƒ‚dS)Nzprocess object is closed)r(Ú ValueErrorrrrr Ú _check_closedcszBaseProcess._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 ÚrungszBaseProcess.runcCs>| ¡tƒ| |¡|_|jj|_|`|`|`t   |¡dS)z% Start child process N) r;r rrÚsentinelÚ _sentinelr)r+r-r r3rrrr Ústartns    zBaseProcess.startcCs| ¡|j ¡dS)zT Terminate process; sends SIGTERM signal or uses TerminateProcess() N)r;rÚ terminaterrrr r@€szBaseProcess.terminatecCs| ¡|j ¡dS)zT Terminate process; sends SIGKILL signal or uses TerminateProcess() N)r;rÚkillrrrr rA‡szBaseProcess.killcCs*| ¡|j |¡}|dk r&t |¡dS)z5 Wait until child process terminates N)r;rÚwaitr r)rÚtimeoutÚresrrr r0Žs zBaseProcess.joincCsJ| ¡|tkrdS|jdkr"dS|j ¡}|dkr8dSt |¡dSdS)z1 Return whether process is alive TNF)r;rrrr r)rÚ returncoderrr Úis_alive™s   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)rrr:Úcloser>r rr(rrrr rG¬s   zBaseProcess.closecCs|jSr©r1rrrr r&½szBaseProcess.namecCs ||_dSrrH)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ÚauthkeyrJrrrr rKÕszBaseProcess.authkeycCst|ƒ|jd<dS)z2 Set authorization key of process rKN)ÚAuthenticationStringr!)rrKrrr rKÙscCs"| ¡|jdkr|jS|j ¡S)zM Return exit code of process or `None` if it has yet to stop N)r;rrrrrr Úexitcodeàs zBaseProcess.exitcodecCs*| ¡|tkrt ¡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.identcCs4| ¡z|jWStk r.tdƒd‚YnXdS)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}|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) NZstartedÚclosedÚunknownÚinitialZstoppedzname=%rzpid=%sz parent=%sz exitcode=%srz<%s>ú )rr(r%r#r$rrr.r/r1ÚappendrNÚ_exitcode_to_namerIrr0)rrMZstatusÚinforrr Ú__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: )'ÚrZr[Ú threadingZ _shutdownrWZ_flush_std_streamsZ _start_methodZ_force_start_methodÚ itertoolsr8rÚsetr Z _close_stdinrÚ_ParentProcessr'r%r Z_HAVE_THREAD_NATIVE_IDZ main_threadZ_set_native_idZ_finalizer_registryÚclearZ_run_after_forkersZ_exit_functionr<Ú SystemExitr6Ú isinstanceÚintÚsysÚstderrÚwriterÚ tracebackr&Ú print_exc)rZparent_sentinelrZr[rMZ old_processÚerirrr Ú _bootstrap"sR   ÿ      zBaseProcess._bootstrap)N)N)r/Ú __module__Ú __qualname__Ú__doc__rr9r;r<r?r@rAr0rFrGÚpropertyr&ÚsetterrrKrMrOrNr=rXrlrrrr rGsD ÿ           c@seZdZdd„ZdS)rLcCs,ddlm}|ƒdkrtdƒ‚tt|ƒffS)NrY)Úget_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r[rrÚ TypeErrorrLÚbytes)rrrrrr Ú __reduce__Xs   ÿzAuthenticationString.__reduce__N)r/rmrnrurrrr rLWsrLc@s6eZdZdd„Zdd„Zedd„ƒZd dd „ZeZdS) racCs4d|_||_||_d|_d|_d|_||_i|_dS)NrF)r r1Ú_pidr%rr(r>r!)rr&rNr=rrr r9hsz_ParentProcess.__init__cCsddlm}||jgdd� S)Nr©rB©rC©Zmultiprocessing.connectionrBr>)rrBrrr rFrs z_ParentProcess.is_alivecCs|jSr)rvrrrr rOvsz_ParentProcess.identNcCs ddlm}||jg|d�dS)z6 Wait until parent process terminates rrwrxNry)rrCrBrrr r0zs z_ParentProcess.join)N) r/rmrnr9rFrprOr0rNrrrr rafs    rac@seZdZdd„Zdd„ZdS)Ú _MainProcesscCs8d|_d|_d|_d|_d|_tt d¡ƒddœ|_dS)NrZ MainProcessFé z/mp)rKZ semprefix) r r1r%rr(rLr#Úurandomr!rrrr r9‰s ÿz_MainProcess.__init__cCsdSrrrrrr rG›sz_MainProcess.closeN)r/rmrnr9rGrrrr rz‡srzrYéZSIGÚ_r)$Ú__all__r#rfÚsignalr_r^Z _weakrefsetrÚpathÚabspathÚgetcwdZ ORIGINAL_DIRÚOSErrorrrrr ÚobjectrrtrLrarzr rr8rr`r rVr Ú__dict__Úitemsr&Zsignumr2rrrr Ú s@ÿ    !