U :e~6@sddlZddlZddlZddlZddlZddlZddlmZddlm Z ddddd d d d d ddddddgZ dZ dZ dZ dZdZdZdZdadaddZddZddZddZdd Zd@d d Zd!d"Zd#d$ZeZd%d&Zd'd ZeZ e!Z"d(d)Z#d*d Z$iZ%e!Z&Gd+dde'Z(dAd,d-Z)d.d Z*da+eee)e j,e j-fd/d0Z.e/e.Gd1dde'Z0Gd2ddej1Z2ze3d3Z4Wne5k rd4Z4YnXd5dZ6d6d7Z7d8d9Z8d:d;Z9dd?Z;dS)BN)_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 multiprocessingz+[%(levelname)s/%(processName)s] %(message)sFcGstrtjt|f|dSN)_loggerlogrmsgargsr9/usr/local/python38/lib/python3.8/multiprocessing/util.pyr,scGstrtjt|f|dSr)rrDEBUGrrrr r0scGstrtjt|f|dSr)rrINFOrrrr r4scGstrtjt|f|dSr)rrrrrrr r8scCs|ddl}|z\tsj|tadt_ttdrFt t t t n$tj t diftj t difW5|XtS)z0 Returns logger used by multiprocessing rN unregisterr)logging _acquireLock _releaseLockr getLogger LOGGER_NAME propagatehasattratexitr#_exit_functionregister _exithandlersremoveappend)r$rrr r <s     cCsJddl}t}|t}|}|||||rB||dat S)zB Turn on logging and add a handler which prints to stderr rNT) r$r FormatterDEFAULT_LOGGING_FORMAT StreamHandler setFormatter addHandlersetLevel_log_to_stderrr)levelr$logger formatterhandlerrrr r Ws    cCs tjdkrdSttdrdSdS)NlinuxTgetandroidapilevelF)sysplatformr*rrrr #_platform_supports_abstract_socketsls   r@cCs@|sdSt|tr|ddkSt|tr4|ddkStddS)NFrz(address type of {address!r} unrecognized) isinstancebytesstr TypeError)addressrrr is_abstract_socket_namespacets    rGcCs&||t}|dk r"d|jd<dS)Ntempdir)rcurrent_process_config)rmtreerHrIrrr _remove_temp_dirsrLcCsftjd}|dkrbddl}ddl}|jdd}td|tdt |j |fdd|tjd<|S)NrHrzpymp-)prefixzcreated temp directory %si)r exitpriority) rrIrJgetshutiltempfilemkdtemprrrLrK)rHrPrQrrr r s  c Csftt}||D]H\\}}}}z ||Wqtk r^}ztd|W5d}~XYqXqdS)Nz after forker raised exception %s)list_afterfork_registryitemssort Exceptionr)rUindexidentfuncobjerrr _run_after_forkerss  r]cCs|tttt||f<dSr)rTnext_afterfork_counterid)r[rZrrr r 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)rBintrEformattypeweakrefref_weakref ValueError _callback_args_kwargsr^_finalizer_counter_keyosgetpid_pid_finalizer_registry)selfr[callbackrkwargsrNrrr __init__s"  zFinalize.__init__cCsz ||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)rlKeyErrorrorhrirjrf)rqwrrprrnresrrr __call__s$  zFinalize.__call__cCsDz t|j=Wntk r Yn Xd|_|_|_|_|_dS)z3 Cancel finalization of the object N)rprlrurfrhrirjrqrrr cancels zFinalize.cancelcCs |jtkS)zS Return whether this finalizer is still waiting to invoke callback )rlrpryrrr still_activeszFinalize.still_activec Csz |}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, exitpriority=>) rfAttributeErrorrE __class__r|getattrrhrirDrjrl)rqr[xrrr __repr__s"   zFinalize.__repr__)rNN) r| __module__ __qualname____doc__rtrprrmrnrxrzr{rrrrr rs   c stdkr dSdkrddn fddfddttD}|jdd|D]P}t|}|dk rPtd |z |WqPtk rd dl}|YqPXqPdkrtdS) 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 SNrrprrr z!_run_finalizers..cs|ddk o|dkSrrr) minpriorityrr rrcsg|]}|r|qSrr).0key)frr #sz#_run_finalizers..T)reversez calling %sr) rprSrVrOrrW traceback print_excclear)rkeysr finalizerrr)rrr _run_finalizers s$      rcCs tp tdkS)z6 Returns true if the process is shutting down N)_exitingrrrr r 8scCstsda|d|d|d|dk rr|D] }|jr0|d|j|jq0|D]}|d|j|qX|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)rdaemonname_popen terminatejoin)rrractive_childrenrIrrrr r,@s        r,c@s,eZdZddZddZddZddZd S) rcCs|t|tjdSr)_resetr rryrrr rtqszForkAwareThreadLock.__init__cCs"t|_|jj|_|jj|_dSr) threadingLock_lockacquirereleaseryrrr rus  zForkAwareThreadLock._resetcCs |jSr)r __enter__ryrrr rzszForkAwareThreadLock.__enter__cGs |jj|Sr)r__exit__)rqrrrr r}szForkAwareThreadLock.__exit__N)r|rrrtrrrrrrr rpsc@seZdZddZddZdS)rcCst|dddS)NcSs |jSr)__dict__r)r[rrr rrz)ForkAwareLocal.__init__..)r ryrrr rtszForkAwareLocal.__init__cCs t|dfS)Nr)rcryrrr __reduce__szForkAwareLocal.__reduce__N)r|rrrtrrrrr rs SC_OPEN_MAXcCsNt|dtg}|tt|dD] }t||d||dq(dS)Nr)rSMAXFDrVrangelenrm closerange)fdsirrr rsc CstjdkrdSztjWnttfk r4YnXz@ttjtj}zt|ddt_Wnt|YnXWnttfk rYnXdS)NF)closefd) r>stdincloseOSErrorrgrmopendevnullO_RDONLY)fdrrr _close_stdins   rc CsTztjWnttfk r&YnXztjWnttfk rNYnXdSr)r>stdoutflushr~rgstderrrrrr _flush_std_streamssrcCsxddl}tttt|}t\}}z6||t |gd|dddddddd||dddWSt|t|XdS)NrTrF) _posixsubprocesstuplesortedmaprarmpiper fork_execfsencode)pathrpassfdsr errpipe_read errpipe_writerrr spawnv_passfdss2   rcGs|D]}t|qdS)z/Close each file descriptor given as an argumentN)rmr)rrrrr close_fdssrcCsZddlm}tddlm}|jddlm}|j t | | dS)zKCleanup multiprocessing resources when multiprocessing tests completed.r)support) forkserver)resource_trackerN) testrr_cleanuprr _forkserver_stopr_resource_trackerr gc_collect reap_children)rrrrrr _cleanup_testss     r)N)N)rdr+r subprocessrr__all__NOTSETrr!r"rr(r2rr7rrrrr r r@rGabstract_sockets_supportedrLr WeakValueDictionaryrTcountr_r]r rprkobjectrrr rrrIr,r-rlocalrsysconfrrWrrrrrrrrrr  s       V , *