3 \n.ã@s¬ddlZddlZddlZddlZddlZddlZddlmZddlm Z ddddd d d d d ddddddgZ dZ dZ dZ dZdZdZdZdadadd„Zdd„Zdd„Zdd„Zdd „Zd6d d „Zd!d „ZejƒZejƒZd"d#„Zd$d „Z iZ!ejƒZ"Gd%d„de#ƒZ$d7d&d'„Z%d(d „Z&da'eee%e j(e j)fd)d*„Z*ej+e*ƒGd+d„de#ƒZ,Gd,d„dej-ƒZ.yej/d-ƒZ0Wne1k �r†d.Z0YnXd/d„Z2d0d1„Z3d2d3„Z4d4d5„Z5dS)8éN)Ú_args_from_interpreter_flagsé)ÚprocessÚ sub_debugÚdebugÚinfoÚ sub_warningÚ get_loggerÚ log_to_stderrÚ get_temp_dirÚregister_after_forkÚ is_exitingÚFinalizeÚForkAwareThreadLockÚForkAwareLocalÚclose_all_fds_exceptÚSUBDEBUGÚ SUBWARNINGéé ééZmultiprocessingz+[%(levelname)s/%(processName)s] %(message)sFcGstrtjt|f|žŽdS)N)Ú_loggerÚlogr)ÚmsgÚargs©rú,/usr/lib64/python3.6/multiprocessing/util.pyr,scGstrtjt|f|žŽdS)N)rrÚDEBUG)rrrrrr0scGstrtjt|f|žŽdS)N)rrÚINFO)rrrrrr4scGstrtjt|f|žŽdS)N)rrr)rrrrrr8sc Cs|ddl}|jƒz\tsj|jtƒadt_ttdƒrFtjt ƒtj t ƒn$tj j t fifƒtj j t fifƒWd|jƒXtS)z0 Returns logger used by multiprocessing rNÚ unregister)ÚloggingZ _acquireLockrZ getLoggerÚ LOGGER_NAMEZ propagateÚhasattrÚatexitr Ú_exit_functionÚregisterZ _exithandlersÚremoveÚappendZ _releaseLock)r!rrrr <s     cCsJddl}tƒ}|jtƒ}|jƒ}|j|ƒ|j|ƒ|rB|j|ƒdat S)zB Turn on logging and add a handler which prints to stderr rNT) r!r Z FormatterÚDEFAULT_LOGGING_FORMATZ StreamHandlerZ setFormatterZ addHandlerZsetLevelÚ_log_to_stderrr)Úlevelr!ZloggerZ formatterZhandlerrrrr Ws    cCsdtjƒjjdƒ}|dkr`ddl}ddl}|jdd�}td|ƒtd|j |gdd�|tjƒjd<|S) NÚtempdirrzpymp-)Úprefixzcreated temp directory %séd)rÚ exitpriorityiœÿÿÿ) rÚcurrent_processZ_configÚgetÚshutilÚtempfileZmkdtemprrZrmtree)r,r2r3rrrr ms  cCsjttjƒƒ}|jƒxP|D]H\\}}}}y ||ƒWqtk r`}ztd|ƒWYdd}~XqXqWdS)Nz after forker raised exception %s)ÚlistÚ_afterfork_registryÚitemsÚsortÚ Exceptionr)r6ÚindexZidentÚfuncÚobjÚerrrÚ_run_after_forkerss  r=cCs|tttƒt|ƒ|f<dS)N)r5ÚnextÚ_afterfork_counterÚid)r;r:rrrr ˆsc@sLeZdZdZfddfdd„Zdeeejfdd„Z dd„Z d d „Z d d „Z dS) rzA Class which supports object finalization using weakrefs NcCsT|dk rtj||ƒ|_n||_||_|p*i|_|ttƒf|_t j ƒ|_ |t |j<dS)N) ÚweakrefÚrefÚ_weakrefÚ _callbackÚ_argsÚ_kwargsr>Ú_finalizer_counterÚ_keyÚosÚgetpidÚ_pidÚ_finalizer_registry)Úselfr;ÚcallbackrÚkwargsr/rrrÚ__init__—s  zFinalize.__init__c CsŽy ||j=Wntk r(|dƒYnbX|j|ƒkrD|dƒd}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)rHÚKeyErrorrKrDrErFrC)rMÚwrrLrrJÚresrrrÚ__call__§s  zFinalize.__call__c CsDy t|j=Wntk r Yn Xd|_|_|_|_|_dS)z3 Cancel finalization of the object N)rLrHrQrCrDrErF)rMrrrÚcancel¿s  zFinalize.cancelcCs |jtkS)zS Return whether this finalizer is still waiting to invoke callback )rHrL)rMrrrÚ still_activeËszFinalize.still_activecCs¶y |jƒ}Wnttfk r(d}YnX|dkr>d|jjSd|jjt|jd|jƒf}|jrr|dt|jƒ7}|j rŠ|dt|j ƒ7}|j ddk r®|dt|j dƒ7}|dS) Nz<%s object, dead>z<%s object, callback=%sÚ__name__z, args=z , kwargs=rz, exitprority=ú>) rCÚAttributeErrorÚ TypeErrorÚ __class__rWÚgetattrrDrEÚstrrFrH)rMr;ÚxrrrÚ__repr__Ñs    zFinalize.__repr__) rWÚ __module__Ú __qualname__Ú__doc__rPrLrrIrJrTrUrVr_rrrrr“s c sºtdkr dSˆdkrdd„‰n ‡fdd„‰‡fdd„ttƒDƒ}|jdd�xX|D]P}tj|ƒ}|dk rRtd |ƒy |ƒWqRtk r d dl}|jƒYqRXqRWˆdkr¶tjƒdS) 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)ÚprrrÚôsz!_run_finalizers..cs|ddk o|dˆkS)Nrr)rc)Ú minpriorityrrrdöscsg|]}ˆ|ƒr|‘qSrr)Ú.0Úkey)Úfrrú ýsz#_run_finalizers..T)Úreversez calling %sr) rLr4r7r1rr8Ú tracebackÚ print_excÚclear)reÚkeysrgÚ finalizerrkr)rhrerÚ_run_finalizersæs$       rpcCs tp tdkS)z6 Returns true if the process is shutting down N)Ú_exitingrrrrr scCsŒtsˆda|dƒ|dƒ|dƒ|ƒdk rzx*|ƒD] }|jr2|d|jƒ|jjƒq2Wx"|ƒD]}|d|jƒ|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)rqZdaemonÚnameZ_popenZ terminateÚjoin)rrrpÚactive_childrenr0rcrrrr%s       r%c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) rcCs|jƒt|tjƒdS)N)Ú_resetr r)rMrrrrPKszForkAwareThreadLock.__init__cCs"tjƒ|_|jj|_|jj|_dS)N)Ú threadingZLockÚ_lockÚacquireÚrelease)rMrrrruOs  zForkAwareThreadLock._resetcCs |jjƒS)N)rwÚ __enter__)rMrrrrzTszForkAwareThreadLock.__enter__cGs |jj|ŽS)N)rwÚ__exit__)rMrrrrr{WszForkAwareThreadLock.__exit__N)rWr`rarPrurzr{rrrrrJsc@seZdZdd„Zdd„ZdS)rcCst|dd„ƒdS)NcSs |jjƒS)N)Ú__dict__rm)r;rrrrd]sz)ForkAwareLocal.__init__..)r )rMrrrrP\szForkAwareLocal.__init__cCs t|ƒffS)N)Útype)rMrrrÚ __reduce__^szForkAwareLocal.__reduce__N)rWr`rarPr~rrrrr[sÚ SC_OPEN_MAXécCsRt|ƒdtg}|jƒx4tt|ƒdƒD] }tj||d||dƒq*WdS)Nréÿÿÿÿ)r4ÚMAXFDr7ÚrangeÚlenrIÚ closerange)ZfdsÚirrrrjscCs”tjdkrdSytjjƒWnttfk r4YnXy@tjtjtjƒ}yt|dd�t_Wntj|ƒ‚YnXWnttfk rŽYnXdS)NF)Úclosefd) ÚsysÚstdinÚcloseÚOSErrorÚ ValueErrorrIÚopenÚdevnullÚO_RDONLY)ÚfdrrrÚ _close_stdints   r‘cCsTytjjƒWnttfk r&YnXytjjƒWnttfk rNYnXdS)N)rˆÚstdoutÚflushrYrŒÚstderrrrrrÚ_flush_std_streams‹sr•cCstddl}tttt|ƒƒƒ}tjƒ\}}z2|j|tj|ƒgd|ddddddd d ||dddƒStj |ƒtj |ƒXdS) NrTrFr�r�r�r�r�r�) Ú_posixsubprocessÚtupleÚsortedÚmapÚintrIÚpipeZ fork_execÚfsencoderŠ)ÚpathrZpassfdsr–Z errpipe_readZ errpipe_writerrrÚspawnv_passfds™s   rž)N)N)6rIÚ itertoolsrˆrAr$rvÚ subprocessrÚrÚ__all__ZNOTSETrrrrr"r)rr*rrrrr r r ÚWeakValueDictionaryr5Úcountr?r=r rLrGÚobjectrrpr rqrtr0r%r&rZlocalrÚsysconfr‚r8rr‘r•ržrrrrÚ sf      S ,(