o [d6@sddlZddlZddlZddlZddlZddlZddlmZddlm Z gdZ dZ dZ dZ dZd Zd Zd Zdad ad dZddZddZddZddZd?ddZddZddZeZddZdd ZeZ e!Z"d!d"Z#d#d$Z$iZ%e!Z&Gd%d&d&e'Z(d?d'd(Z)d)d*Z*d a+eee)e j,e j-fd+d,Z.e/e.Gd-d.d.e'Z0Gd/d0d0ej1Z2ze3d1Z4Wn e5yd2Z4Ynwd3d4Z6d5d6Z7d7d8Z8d9d:Z9d;d<Z:d=d>Z;dS)@N)_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)sFcG trtjt|g|RdSdSN)_loggerlogrmsgargsr +/usr/lib/python3.10/multiprocessing/util.pyr,rcGrr)rrDEBUGrr r r!r0r"rcGrr)rrINFOrr r r!r4r"rcGrr)rrrrr r r!r8r"rcCsddl}|zAts<|tadt_ttdr#tt t t n tj t diftj t difW|tSW|tSW|tS|w)z0 Returns logger used by multiprocessing rN unregisterr )logging _acquireLockr getLogger LOGGER_NAME propagatehasattratexitr%_exit_functionregister _exithandlersremoveappend _releaseLock)r&r r r!r <s(     r cCsJddl}t}|t}|}|||||r!||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 formatterhandlerr r r!r Ws    r cCs tjdkrdSttdrdSdS)NlinuxTgetandroidapilevelF)sysplatformr+r r r r!#_platform_supports_abstract_socketsls  rBcCsD|sdSt|tr|ddkSt|tr|ddkStd|d)NFrzaddress type of z unrecognized) isinstancebytesstr TypeError)addressr r r!is_abstract_socket_namespacets    rIcCs*||t}|durd|jd<dSdS)Ntempdir)rcurrent_process_config)rmtreerJrKr r r!_remove_temp_dirs rNcCsftjd}|dur1ddl}ddl}|jdd}td|tdt |j |fdd|tjd<|S)NrJrzpymp-)prefixzcreated temp directory %si)r exitpriority) rrKrLgetshutiltempfilemkdtemprrrNrM)rJrRrSr r r!r s  r c Csftt}||D]$\\}}}}z||Wq ty0}z td|WYd}~q d}~wwdS)Nz after forker raised exception %s)list_afterfork_registryitemssort Exceptionr)rWindexidentfuncobjer r r!_run_after_forkerss  r_cCs|tttt||f<dSr)rVnext_afterfork_counterid)r]r\r r r!r sr c@sFeZdZdZdddZdeeejfddZ dd Z d d Z d d Z dS)rzA Class which supports object finalization using weakrefs r NcCs|durt|tstd|t||durt|||_n|dur'td||_ ||_ |p0i|_ |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)rDintrGformattypeweakrefref_weakref ValueError _callback_args_kwargsr`_finalizer_counter_keyosgetpid_pid_finalizer_registry)selfr]callbackrkwargsrPr r r!__init__s   zFinalize.__init__cCsz||j=Wnty|dYdSw|j|kr"|dd}n|d|j|j|j|j|ji|j}d|_|_|_|_|_|S)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)rnKeyErrorrqrjrkrlrh)rswrrrrrpresr r r!__call__s     zFinalize.__call__cCsDzt|j=Wn tyYdSwd|_|_|_|_|_dS)z3 Cancel finalization of the object N)rrrnrwrhrjrkrlrsr r r!cancels   zFinalize.cancelcCs |jtvS)zS Return whether this finalizer is still waiting to invoke callback )rnrrr{r r r! still_actives zFinalize.still_activec Csz|}Wn ttfyd}Ynw|durd|jjSd|jjt|jd|jf}|jr8|dt|j7}|j rD|dt|j 7}|j ddurV|dt|j d7}|dS) Nz<%s object, dead>z<%s object, callback=%s__name__z, args=z , kwargs=rz, exitpriority=>) rhAttributeErrorrG __class__r~getattrrjrkrFrlrn)rsr]xr r r!__repr__s$  zFinalize.__repr__)r NN) r~ __module__ __qualname____doc__rvrrrrorprzr|r}rr r r r!rs   rc stdurdSdurddnfddfddttD}|jdd|D]'}t|}|durOtd |z|Wq(tyNd dl}|Yq(wq(durZtdSdS) 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 |dduSNrr pr r r!s z!_run_finalizers..cs|dduo |dkSrr r) minpriorityr r!rcsg|]}|r|qSr r ).0key)fr r! #rz#_run_finalizers..T)reversez calling %sr) rrrUrXrQrrY traceback print_excclear)rkeysr finalizerrr )rrr!_run_finalizers s*         rcCs tptduS)z6 Returns true if the process is shutting down N)_exitingr r r r!r 8s r cCstsBda|d|d|d|dur9|D]}|jr(|d|j|jq|D] }|d|j|q,|d|dSdS)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_childrenrKrr r r!r-@s"         r-c@s,eZdZddZddZddZddZd S) rcCs.t|_|jj|_|jj|_t|tjdSr) threadingLock_lockacquirereleaser r_at_fork_reinitr{r r r!rvqs   zForkAwareThreadLock.__init__cCs|jdSr)rrr{r r r!rwsz#ForkAwareThreadLock._at_fork_reinitcC |jSr)r __enter__r{r r r!rzs zForkAwareThreadLock.__enter__cGs |jj|Sr)r__exit__)rsrr r r!r} zForkAwareThreadLock.__exit__N)r~rrrvrrrr r r r!rps  rc@seZdZddZddZdS)rcCst|dddS)NcSrr)__dict__r)r]r r r!rs z)ForkAwareLocal.__init__..)r r{r r r!rvszForkAwareLocal.__init__cCs t|dfS)Nr )rer{r r r! __reduce__rzForkAwareLocal.__reduce__N)r~rrrvrr r r r!rs r SC_OPEN_MAXcCsbt|dtg}||dtksJdtt|dD]}t||d||dqdS)Nz fd too larger)rUMAXFDrXrangelenro closerange)fdsir r r!rs rc CstjdurdSztjWn ttfyYnwzttjtj}z t|dddt_WWdSt|ttfyDYdSw)Nzutf-8F)encodingclosefd) r@stdincloseOSErrorriroopendevnullO_RDONLY)fdr r r! _close_stdins"  rc CsPztjWn ttfyYnwztjWdSttfy'YdSwr)r@stdoutflushrristderrr r r r!_flush_std_streamssrcCsddl}tttt|}t\}}z(||t|gd|dddddddd||dddddddWt |t |St |t |w)NrTrF) _posixsubprocesstuplesortedmaprcropipe fork_execfsencoder)pathrpassfdsr errpipe_read errpipe_writer r r!spawnv_passfdss    rcGs|D]}t|qdS)z/Close each file descriptor given as an argumentN)ror)rrr r r! close_fdss rcCsZddlm}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)rrrr r r!_cleanup_testss      rr)sr         V, *