3 \ Pã@s^dZddlZddlZddlmZddlZddlmZddlZddlmZddl m Z ddl Z ddl Z ddl mZddlZddlZe jƒZdad d „Zd ZGd d „d eƒZGdd„dƒZdd„ZGdd„deƒZGdd„deƒZGdd„deƒZdd„Zdd„Zdd„Z dd„Z!d d!„Z"da#da$d"d#„Z%d$d%„Z&Gd&d'„d'e'ƒZ(Gd(d)„d)ej)ƒZ*ej+eƒdS)*z"Brian Quinlan (brian@sweetapp.com)éN)Ú_base)ÚFull)Ú SimpleQueue)Úwait)ÚpartialFcCsJdattjƒƒ}x|D]\}}|jdƒqWx|D]\}}|jƒq2WdS)NT)Ú _shutdownÚlistÚ_threads_queuesÚitemsÚputÚjoin)r ÚtÚq©rú2/usr/lib64/python3.6/concurrent/futures/process.pyÚ _python_exitOs  réc@seZdZdd„Zdd„ZdS)Ú_RemoteTracebackcCs ||_dS)N)Útb)ÚselfrrrrÚ__init__asz_RemoteTraceback.__init__cCs|jS)N)r)rrrrÚ__str__csz_RemoteTraceback.__str__N)Ú__name__Ú __module__Ú __qualname__rrrrrrr`src@seZdZdd„Zdd„ZdS)Ú_ExceptionWithTracebackcCs0tjt|ƒ||ƒ}dj|ƒ}||_d||_dS)NÚz """ %s""")Ú tracebackÚformat_exceptionÚtyper Úexcr)rr rrrrrgs z _ExceptionWithTraceback.__init__cCst|j|jffS)N)Ú _rebuild_excr r)rrrrÚ __reduce__lsz"_ExceptionWithTraceback.__reduce__N)rrrrr"rrrrrfsrcCst|ƒ|_|S)N)rÚ __cause__)r rrrrr!os r!c@seZdZdd„ZdS)Ú _WorkItemcCs||_||_||_||_dS)N)ÚfutureÚfnÚargsÚkwargs)rr%r&r'r(rrrrtsz_WorkItem.__init__N)rrrrrrrrr$ssr$c@seZdZddd„ZdS)Ú _ResultItemNcCs||_||_||_dS)N)Úwork_idÚ exceptionÚresult)rr*r+r,rrrr{sz_ResultItem.__init__)NN)rrrrrrrrr)zsr)c@seZdZdd„ZdS)Ú _CallItemcCs||_||_||_||_dS)N)r*r&r'r()rr*r&r'r(rrrr�sz_CallItem.__init__N)rrrrrrrrr-€sr-cgs0t|Ž}x"ttj||ƒƒ}|s"dS|Vq WdS)N)ÚzipÚtupleÚ itertoolsÚislice)Ú chunksizeÚ iterablesÚitÚchunkrrrÚ _get_chunks‡s r6cs‡fdd„|DƒS)Ncsg|] }ˆ|Ž‘qSrr)Ú.0r')r&rrú ™sz"_process_chunk..r)r&r5r)r&rÚ_process_chunk�s r9cCsœx–|jdd�}|dkr(|jtjƒƒdSy|j|j|jŽ}WnBtk r~}z&t||j ƒ}|jt |j |d�ƒWYdd}~XqX|jt |j |d�ƒqWdS)NT)Úblock)r+)r,) Úgetr ÚosÚgetpidr&r'r(Ú BaseExceptionrÚ __traceback__r)r*)Ú call_queueÚ result_queueZ call_itemÚrÚer rrrÚ_process_worker›s   & rDcCsxxr|jƒrdSy|jdd�}Wntjk r4dSX||}|jjƒrh|jt||j|j |j ƒdd�q||=qqWdS)NF)r:T) Zfullr;ÚqueueZEmptyr%Zset_running_or_notify_cancelr r-r&r'r()Úpending_work_itemsZwork_idsr@r*Ú work_itemrrrÚ_add_call_item_to_queue·s   rHc s˜d‰‡fdd„}‡‡fdd„}|j}�xlt||ˆƒdd„ˆjƒDƒ} t|g| ƒ} || krf|jƒ} nr|ƒ‰ˆdk r„dˆ_dˆ_d‰x&|jƒD]\} } | jj t dƒƒ~ qŽW|j ƒxˆjƒD] }|j ƒq¾W|ƒdSt | tƒ�rˆj| ƒ}|jƒˆ�sR|ƒdSnJ| dk �rR|j| jdƒ} | dk �rR| j�rB| jj | jƒn| jj| jƒ~ |ƒ‰|ƒ�rŒy|�sr|ƒdSWntk �rŠYnXd‰q(WdS) NcstpˆdkpˆjS)N)rÚ_shutdown_threadr)ÚexecutorrrÚ shutting_downösz/_queue_management_worker..shutting_downcsZtdd„ˆjƒDƒƒ}xtd|ƒD]}ˆjdƒq"WˆjƒxˆjƒD] }|jƒqFWdS)Ncss|]}|jƒVqdS)N)Zis_alive)r7Úprrrú ûszD_queue_management_worker..shutdown_worker..r)ÚsumÚvaluesÚrangeZ put_nowaitÚcloser )Znb_children_aliveÚirL)r@Ú processesrrÚshutdown_workerùs z1_queue_management_worker..shutdown_workercSsg|] }|j‘qSr)Úsentinel)r7rLrrrr8 sz,_queue_management_worker..Tz^A process in the process pool was terminated abruptly while the future was running or pending.)Z_readerrHrOrZrecvÚ_brokenrIr r%Z set_exceptionÚBrokenProcessPoolÚclearZ terminateÚ isinstanceÚintÚpopr r*r+Z set_resultr,r)Zexecutor_referencerSrFZwork_ids_queuer@rArKrTÚreaderZ sentinelsZreadyZ result_itemr*rGrLr)r@rJrSrÚ_queue_management_workerÜsb        r]c Cshtrtrttƒ‚daytjdƒ}Wnttfk r:dSX|dkrHdS|dkrTdSd|attƒ‚dS)NTÚSC_SEM_NSEMS_MAXréz@system provides too few semaphores (%d available, 256 necessary)éÿÿÿÿ)Ú_system_limits_checkedÚ_system_limitedÚNotImplementedErrorr<ÚsysconfÚAttributeErrorÚ ValueError)Z nsems_maxrrrÚ_check_system_limitsQsrgccs.x(|D] }|jƒx|r$|jƒVqWqWdS)N)Úreverser[)ÚiterableÚelementrrrÚ_chain_from_iterable_of_listshs rkc@s eZdZdS)rWN)rrrrrrrrWtsrWcsheZdZddd„Zdd„Zdd„Zdd „Zejjj e_ dd d œ‡fd d „ Z ddd„Z ejj j e _ ‡Z S)ÚProcessPoolExecutorNcCs’tƒ|dkrtjƒpd|_n|dkr.tdƒ‚||_tj|jtƒ|_d|j_ t ƒ|_ t jƒ|_ d|_i|_d|_tjƒ|_d|_d|_i|_dS)Nrrz"max_workers must be greater than 0TF)rgr<Ú cpu_countÚ _max_workersrfÚmultiprocessingZQueueÚEXTRA_QUEUED_CALLSÚ _call_queueZ _ignore_epiperÚ _result_queuerEÚ _work_idsÚ_queue_management_threadÚ _processesrIÚ threadingZLockÚ_shutdown_lockrVÚ _queue_countÚ_pending_work_items)rZ max_workersrrrr|s$   zProcessPoolExecutor.__init__cCsp|jfdd„}|jdkrl|jƒtjttj||ƒ|j|j |j |j |jfd�|_d|j_ |jj ƒ|jt|j<dS)NcSs|jdƒdS)N)r )Ú_rrrrÚ weakref_cb§szFProcessPoolExecutor._start_queue_management_thread..weakref_cb)Útargetr'T)rrrtÚ_adjust_process_countrvZThreadr]ÚweakrefÚrefruryrsrqZdaemonÚstartr )rr{rrrÚ_start_queue_management_thread¤s   z2ProcessPoolExecutor._start_queue_management_threadcCsJxDtt|jƒ|jƒD].}tjt|j|jfd�}|j ƒ||j|j <qWdS)N)r|r') rPÚlenrurnroZProcessrDrqrrr€Úpid)rrzrLrrrr}¸s z)ProcessPoolExecutor._adjust_process_countc Os„|j�t|jrtdƒ‚|jr$tdƒ‚tjƒ}t||||ƒ}||j|j <|j j |j ƒ|j d7_ |j j dƒ|j ƒ|SQRXdS)NzKA child process terminated abruptly, the process pool is not usable anymorez*cannot schedule new futures after shutdownr)rwrVrWrIÚ RuntimeErrorrZFuturer$ryrxrsr rrr�)rr&r'r(ÚfÚwrrrÚsubmitÁs  zProcessPoolExecutor.submitr)Útimeoutr2cs:|dkrtdƒ‚tƒjtt|ƒt|d|iŽ|d�}t|ƒS)Nrzchunksize must be >= 1.r2)rˆ)rfÚsuperÚmaprr9r6rk)rr&rˆr2r3Zresults)Ú __class__rrrŠÖs  zProcessPoolExecutor.mapTc CsT|j� d|_WdQRX|jr8|jjdƒ|r8|jjƒd|_d|_d|_d|_dS)NT)rwrIrtrrr r rqru)rrrrrÚshutdownós  zProcessPoolExecutor.shutdown)N)T) rrrrr�r}r‡rÚExecutorÚ__doc__rŠrŒÚ __classcell__rr)r‹rrl{s (   rl),Ú __author__Úatexitr<Zconcurrent.futuresrrErrorZmultiprocessing.connectionrrvr~Ú functoolsrr0rÚWeakKeyDictionaryr rrrpÚ Exceptionrrr!Úobjectr$r)r-r6r9rDrHr]rarbrgrkr„rWr�rlÚregisterrrrrÚ.sH         %s