a XC?hC"�@s�dZdZddlmZddlZddlZddlZddlZddlZddl Z e� �Z da e� �Zdd�Ze�e�ee d�r�e jejejejd �Gd d �d e�Zd d �ZGdd�dej�ZGdd�dej�ZdS)zImplements ThreadPoolExecutor.z"Brian Quinlan ([email protected])�)�_baseNFcCsft�daWd�n1s0Ytt���}|D]\}}|�d�q8|D]\}}|��qPdS�NT)�_global_shutdown_lock� _shutdown�list�_threads_queues�items�put�join)r�t�q�r �>/opt/alt/python39/lib64/python3.9/concurrent/futures/thread.py� _python_exits"    r�register_at_fork)ZbeforeZafter_in_childZafter_in_parentc@s&eZdZdd�Zdd�Zeej�ZdS)� _WorkItemcCs||_||_||_||_dS�N)�future�fn�args�kwargs)�selfrrrrr r r�__init__/sz_WorkItem.__init__c Csl|j��sdSz|j|ji|j��}Wn4tyZ}z|j�|�d}WYd}~nd}~00|j�|�dSr)rZset_running_or_notify_cancelrrr� BaseException� set_exceptionZ set_result)r�result�excr r r�run5s  z _WorkItem.runN) �__name__� __module__� __qualname__rr� classmethod�types� GenericAlias�__class_getitem__r r r rr.s rcCs�|durPz ||�Wn:tyNtjjddd�|�}|durH|��YdS0zx|jdd�}|dur�|��~|�}|dur�|j��~qR|�}t s�|dus�|j r�|dur�d|_ |� d�WdS~qRWn"ty�tjjddd�Yn0dS)NzException in initializer:T)�exc_info)�blockzException in worker) rrZLOGGERZcritical�_initializer_failed�getr�_idle_semaphore�releaserr )Zexecutor_referenceZ work_queue� initializer�initargsZexecutor� work_itemr r r�_workerEs8      r.c@seZdZdZdS)�BrokenThreadPoolzR Raised when a worker thread in a ThreadPoolExecutor failed initializing. N)rrr �__doc__r r r rr/psr/c@s`eZdZe��jZddd�Zdd�Ze j jj e_ dd �Z d d �Z dd d�dd�Ze j jj e_ dS)�ThreadPoolExecutorN�r cCs�|durtdt��pdd�}|dkr.td��|durFt|�sFtd��||_t��|_ t � d�|_ t �|_d|_d|_t ��|_|p�d |��|_||_||_dS) a�Initializes 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)�min�os� cpu_count� ValueError�callable� TypeError� _max_workers�queueZ SimpleQueue� _work_queue� threadingZ Semaphorer)�set�_threads�_brokenr�Lock�_shutdown_lock�_counter�_thread_name_prefix� _initializer� _initargs)rZ max_workersZthread_name_prefixr+r,r r rr{s$     �zThreadPoolExecutor.__init__c Os�|j��t�v|jrt|j��|jr,td��tr8td��t��}t||||�}|j � |�|� �|Wd�Wd�S1s�0YWd�n1s�0YdS)Nz*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdown) rDrrBr/r� RuntimeErrorrZFuturerr>r �_adjust_thread_count)rrrr�f�wr r r�submit�s  zThreadPoolExecutor.submitcCs�|jjdd�rdS|jfdd�}t|j�}||jkr�d|jp>||f}tj|t t � ||�|j|j |j fd�}|��|j�|�|jt|<dS)Nr)ZtimeoutcSs|�d�dSr)r )�_r r r r� weakref_cb�sz;ThreadPoolExecutor._adjust_thread_count..weakref_cbz%s_%d)�name�targetr)r)�acquirer>�lenrAr<rFr?ZThreadr.�weakref�refrGrH�start�addr)rrOZ num_threadsZ thread_namer r r rrJ�s$   � �� z'ThreadPoolExecutor._adjust_thread_countc Cst|j�Zd|_z|j��}Wntjy4YqRYn0|dur|j�t|j��qWd�n1sf0YdS)NzBA thread initializer failed, the thread pool is not usable anymore) rDrBr>� get_nowaitr=�Emptyrrr/)rr-r r rr'�s z&ThreadPoolExecutor._initializer_failedTF)�cancel_futuresc Cs�|j�bd|_|rNz|j��}Wntjy8YqNYn0|dur|j��q|j�d�Wd�n1sn0Y|r�|j D] }|� �q�dSr) rDrr>rXr=rYrZcancelr rAr )r�waitrZr-r r r r�shutdown�s  * zThreadPoolExecutor.shutdown)Nr2Nr )T)rrr � itertools�count�__next__rErrMr�Executorr0rJr'r\r r r rr1vs � &  r1)r0� __author__Zconcurrent.futuresrr]r=r?r"rTr7�WeakKeyDictionaryrrrCrrZ_register_atexit�hasattrrrR�_at_fork_reinitr*�objectrr.ZBrokenExecutorr/r`r1r r r r�s,   �+