U :e@"@sdZdZddlZddlmZddlZddlZddlZddlZddl Z e Z da ddZ ee Gdd d eZd d ZGd d d ejZGdddejZdS)zImplements ThreadPoolExecutor.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@seZdZdZdS)BrokenThreadPoolzR Raised when a worker thread in a ThreadPoolExecutor failed initializing. N)rrr __doc__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) aInitializes a new ThreadPoolExecutor instance. Args: max_workers: The maximum number of threads that can be used to execute the given calls. thread_name_prefix: An optional name prefix to give our threads. initializer: A callable used to initialize worker threads. initargs: A tuple of arguments to pass to the initializer. 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 %dr4z*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdown)lenr;popwarningswarnDeprecationWarningrFrDr/r RuntimeErrorrFuturerr?r_adjust_thread_count)rrrrrPfwr 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?rNrCr<rHr@Threadr.weakrefrefrIrJdaemonstartaddr)rr[Z num_threadsZ thread_namer r r r rUs&     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) rFrDr? get_nowaitr=Emptyrrr/)rr-r r r r%s z&ThreadPoolExecutor._initializer_failedTc Cs@|jd|_|jdW5QRX|r<|jD] }|q.dSr)rFrr?rrCr )rwaitr r r r shutdowns  zThreadPoolExecutor.shutdown)Nr2Nr )T)rrr itertoolscount__next__rGrrXrExecutor__text_signature__r0rUr%rhr r r r r1ss  &   r1)r0 __author__atexitconcurrent.futuresrrir=r@r`r7WeakKeyDictionaryrrrregisterobjectrr.BrokenExecutorr/rlr1r r r r s   +