U :e@"@sdZddlZddlmZddlZddlZddlZddlZddlZe Z da ddZ e e GdddeZd d ZGd d d ejZGd ddejZdS)z"Brian Quinlan (brian@sweetapp.com)N)_baseFcCsBdatt}|D]\}}|dq|D]\}}|q,dSNT) _shutdownlist_threads_queuesitemsputjoin)rtqr >/usr/local/python38/lib/python3.8/concurrent/futures/thread.py _python_exit!s     rc@seZdZddZddZdS) _WorkItemcCs||_||_||_||_dSN)futurefnargskwargs)selfrrrrr r r __init__.sz_WorkItem.__init__c Csf|jsdSz|j|j|j}Wn2tk rT}z|j|d}W5d}~XYnX|j|dSr)rset_running_or_notify_cancelrrr BaseException set_exception set_result)rresultexcr r r run4s  z _WorkItem.runN)__name__ __module__ __qualname__rrr r r r r-srcCs|dk rRz ||Wn<tk rPtjjddd|}|dk rJ|YdSXzx|jdd}|dk r|~|}|dk r|j~qT|}t s|dks|j r|dk rd|_ | dWdS~qTWn$tk rtjjdddYnXdS)NzException in initializer:T)exc_info)blockzException in worker) rrLOGGERcritical_initializer_failedgetr_idle_semaphorereleaserr)executor_referenceZ work_queue initializerinitargsexecutor work_itemr r r _workerBs8    r.c@s eZdZdS)BrokenThreadPoolN)rrr r r r r r/msr/c@sfeZdZejZdddZddZe j jj e_ e j jj e_ dd Z d d Zdd dZe j jj e_ dS)ThreadPoolExecutorNr cCs|dkrtdtpdd}|dkr.td|dk rFt|sFtd||_t|_ t d|_ t |_d|_d|_t |_|pd||_||_||_dS) N rz"max_workers must be greater than 0zinitializer must be a callableFzThreadPoolExecutor-%d)minos cpu_count ValueErrorcallable TypeError _max_workersqueue SimpleQueue _work_queue threading Semaphorer'set_threads_brokenrLock_shutdown_lock_counter_thread_name_prefix _initializer _initargs)r max_workersZthread_name_prefixr*r+r r r rxs$     zThreadPoolExecutor.__init__c Ost|dkr|^}}}nV|s&tdnHd|krZ|d}|^}}ddl}|jdtddntdt|d|jf|jrt|j|j rt d t rt d t }t ||||}|j|||W5QRSQRXdS) NzDdescriptor 'submit' of 'ThreadPoolExecutor' object needs an argumentrrz.Passing 'fn' as keyword argument is deprecated) stacklevelz6submit expected at least 1 positional argument, got %dr3z*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdown)lenr:popwarningswarnDeprecationWarningrErCr/r RuntimeErrorrFuturerr>r_adjust_thread_count)rrrrrOfwr r r submits6       zThreadPoolExecutor.submitcCs|jjddrdS|jfdd}t|j}||jkrd|jp>||f}tj|t t |||j|j |j fd}d|_||j||jt|<dS)Nr)timeoutcSs|ddSr)r)_r r r r weakref_cbsz;ThreadPoolExecutor._adjust_thread_count..weakref_cbz%s_%d)nametargetrT)r'acquirer>rMrBr;rGr?Threadr.weakrefrefrHrIdaemonstartaddr)rrZZ num_threadsZ thread_namer r r r rTs&     z'ThreadPoolExecutor._adjust_thread_countc Csb|jRd|_z|j}Wntjk r6YqTYnX|dk r|jt|jqW5QRXdS)NzBA thread initializer failed, the thread pool is not usable anymore) rErCr> get_nowaitr<Emptyrrr/)rr-r r r r%s z&ThreadPoolExecutor._initializer_failedTc Cs@|jd|_|jdW5QRX|r<|jD] }|q.dSr)rErr>rrBr )rwaitr r r r shutdowns  zThreadPoolExecutor.shutdown)Nr1Nr )T)rrr itertoolscount__next__rFrrWrExecutor__text_signature____doc__rTr%rgr r r r r0ss  &   r0) __author__atexitconcurrent.futuresrrhr<r?r_r6WeakKeyDictionaryrrrregisterobjectrr.BrokenExecutorr/rkr0r r r r s  +