B -_P/@sddlZddlZddlZddlZddlZddlZddlmZddlm Z ddddd d d d d ddddddgZ dZ dZ dZ dZdZdZdZdadaddZddZddZddZdd Zd6d d Zd!d ZeZeZd"d#Zd$d Z iZ!eZ"Gd%dde#Z$d7d&d'Z%d(d Z&da'eee%e j(e j)fd)d*Z*e+e*Gd+dde#Z,Gd,ddej-Z.ye/d-Z0Wne1k rd.Z0YnXd/dZ2d0d1Z3d2d3Z4d4d5Z5dS)8N)_args_from_interpreter_flags)process sub_debugdebuginfo sub_warning get_logger log_to_stderr get_temp_dirregister_after_fork is_exitingFinalizeForkAwareThreadLockForkAwareLocalclose_all_fds_exceptSUBDEBUG SUBWARNING Zmultiprocessingz+[%(levelname)s/%(processName)s] %(message)sFcGstrtjt|f|dS)N)_loggerlogr)msgargsr*/usr/lib/python3.7/multiprocessing/util.pyr,scGstrtjt|f|dS)N)rrDEBUG)rrrrrr0scGstrtjt|f|dS)N)rrINFO)rrrrrr4scGstrtjt|f|dS)N)rrr)rrrrrr8scCs|ddl}|z\tsj|tadt_ttdrFtt t t n$tj t diftj t difWd|XtS)z0 Returns logger used by multiprocessing rN unregisterr)loggingZ _acquireLockrZ getLogger LOGGER_NAMEZ propagatehasattratexitr _exit_functionregisterZ _exithandlersremoveappendZ _releaseLock)r!rrrr <s     cCsJddl}t}|t}|}|||||rB||dat S)zB Turn on logging and add a handler which prints to stderr rNT) r!r Z FormatterDEFAULT_LOGGING_FORMATZ StreamHandlerZ setFormatterZ addHandlerZsetLevel_log_to_stderrr)levelr!ZloggerZ formatterZhandlerrrrr Ws    cCsdtjd}|dkr`ddl}ddl}|jdd}td|td|j |gdd|tjd<|S)Ntempdirrzpymp-)prefixzcreated temp directory %si)r exitpriority) rcurrent_processZ_configgetshutiltempfileZmkdtemprrZrmtree)r,r1r2rrrr ms  c Csjtt}|xP|D]H\\}}}}y ||Wqtk r`}ztd|Wdd}~XYqXqWdS)Nz after forker raised exception %s)list_afterfork_registryitemssort Exceptionr)r5indexZidentfuncobjerrr_run_after_forkerss  r<cCs|tttt||f<dS)N)r4next_afterfork_counterid)r:r9rrrr sc@sFeZdZdZdddZdeeejfddZ dd Z d d Z d d Z dS)rzA Class which supports object finalization using weakrefs rNcCs|dk r&t|ts&td|t||dk r>t|||_n|dkrNtd||_ ||_ |p`i|_ |t t f|_t|_|t|j<dS)Nz3Exitpriority ({0!r}) must be None or int, not {1!s}z+Without object, exitpriority cannot be None) isinstanceint TypeErrorformattypeweakrefref_weakref ValueError _callback_args_kwargsr=_finalizer_counter_keyosgetpid_pid_finalizer_registry)selfr:callbackrkwargsr.rrr__init__s  zFinalize.__init__cCsy ||j=Wntk r(|dYnbX|j|krD|dd}n$|d|j|j|j|j|j|j}d|_|_|_|_|_|SdS)zQ Run the callback unless it has already been called or cancelled zfinalizer no longer registeredz+finalizer ignored because different processNz/finalizer calling %s with args %s and kwargs %s)rMKeyErrorrPrIrJrKrG)rRZwrrQrrOZresrrr__call__s  zFinalize.__call__cCsDy t|j=Wntk r Yn Xd|_|_|_|_|_dS)z3 Cancel finalization of the object N)rQrMrVrGrIrJrK)rRrrrcancels  zFinalize.cancelcCs |jtkS)zS Return whether this finalizer is still waiting to invoke callback )rMrQ)rRrrr still_activeszFinalize.still_activec Csy |}Wnttfk r(d}YnX|dkr>d|jjSd|jjt|jd|jf}|jrr|dt|j7}|j r|dt|j 7}|j ddk r|dt|j d7}|dS) Nz<%s object, dead>z<%s object, callback=%s__name__z, args=z , kwargs=rz, exitprority=>) rGAttributeErrorrB __class__rZgetattrrIrJstrrKrM)rRr:xrrr__repr__s    zFinalize.__repr__)rNN) rZ __module__ __qualname____doc__rUrQrrNrOrWrXrYrarrrrrs  c stdkr dSdkrddn fddfddttD}|jddxX|D]P}t|}|dk rRtd |y |WqRtk rd dl}|YqRXqRWdkrtdS) z Run all finalizers whose exit priority is not None and at least minpriority Finalizers with highest priority are called first; finalizers with the same priority will be called in reverse order of creation. NcSs |ddk S)Nrr)prrrz!_run_finalizers..cs|ddk o|dkS)Nrr)re) minpriorityrrrfrgcsg|]}|r|qSrr).0key)frr sz#_run_finalizers..T)reversez calling %sr) rQr3r6r0rr7 traceback print_excclear)rhkeysrj finalizerrnr)rkrhr_run_finalizerss$       rscCs tp tdkS)z6 Returns true if the process is shutting down N)_exitingrrrrr scCstsda|d|d|d|dk rzx*|D] }|jr2|d|j|jq2Wx"|D]}|d|j|q^W|d|dS)NTzprocess shutting downz2running all "atexit" finalizers with priority >= 0rz!calling terminate() for daemon %szcalling join() for process %sz)running the remaining "atexit" finalizers)rtZdaemonnameZ_popenZ terminatejoin)rrrsactive_childrenr/rerrrr%s       r%c@s,eZdZddZddZddZddZd S) rcCs|t|tjdS)N)_resetr r)rRrrrrUNszForkAwareThreadLock.__init__cCs"t|_|jj|_|jj|_dS)N) threadingZLock_lockacquirerelease)rRrrrrxRs  zForkAwareThreadLock._resetcCs |jS)N)rz __enter__)rRrrrr}WszForkAwareThreadLock.__enter__cGs |jj|S)N)rz__exit__)rRrrrrr~ZszForkAwareThreadLock.__exit__N)rZrbrcrUrxr}r~rrrrrMsc@seZdZddZddZdS)rcCst|dddS)NcSs |jS)N)__dict__rp)r:rrrrf`rgz)ForkAwareLocal.__init__..)r )rRrrrrU_szForkAwareLocal.__init__cCs t|dfS)Nr)rD)rRrrr __reduce__aszForkAwareLocal.__reduce__N)rZrbrcrUrrrrrr^s SC_OPEN_MAXcCsft|dtg}||dtks,tdx4tt|dD] }t||d||dq>WdS)Nz fd too larger)r3MAXFDr6AssertionErrorrangelenrN closerange)Zfdsirrrrms c CstjdkrdSytjWnttfk r4YnXy@ttjtj}yt|ddt_Wnt|YnXWnttfk rYnXdS)NF)closefd) sysstdincloseOSErrorrHrNopendevnullO_RDONLY)fdrrr _close_stdinws   rc CsTytjWnttfk r&YnXytjWnttfk rNYnXdS)N)rstdoutflushr\rHstderrrrrr_flush_std_streamssrcCstddl}tttt|}t\}}z2||t|gd|dddddddd||dddSt |t |XdS)NrTrF) _posixsubprocesstuplesortedmaprArNpipeZ fork_execfsencoder)pathrZpassfdsrZ errpipe_readZ errpipe_writerrrspawnv_passfdss   r)N)N)6rN itertoolsrrEr$ry subprocessrr__all__ZNOTSETrrrrr"r)rr*rrrrr r r ZWeakValueDictionaryr4countr>r<r rQrLobjectrrsr rtrwr/r%r&rZlocalrsysconfrr7rrrrrrrr sf      V ,(