U
    pd@"                     @   s   d Z dZddlZddlmZ ddlZddlZddlZddlZddl	Z	e
 Zdadd Zee G dd	 d	eZd
d ZG dd dejZG dd dejZdS )zImplements ThreadPoolExecutor.z"Brian Quinlan (brian@sweetapp.com)    N)_baseFc                  C   sB   da tt } | D ]\}}|d  q| D ]\}}|  q,d S NT)	_shutdownlist_threads_queuesitemsputjoin)r   tq r   //usr/lib/python3.8/concurrent/futures/thread.py_python_exit!   s    r   c                   @   s   e Zd Zdd Zdd ZdS )	_WorkItemc                 C   s   || _ || _|| _|| _d S N)futurefnargskwargs)selfr   r   r   r   r   r   r   __init__.   s    z_WorkItem.__init__c              
   C   sf   | j  sd S z| j| j| j}W n2 tk
rT } z| j | d } W 5 d }~X Y nX | j | d S r   )r   Zset_running_or_notify_cancelr   r   r   BaseExceptionset_exceptionZ
set_result)r   resultexcr   r   r   run4   s    
z_WorkItem.runN)__name__
__module____qualname__r   r   r   r   r   r   r   -   s   r   c                 C   s   |d k	rRz||  W n< t k
rP   tjjddd |  }|d k	rJ|  Y d S X zx|jdd}|d k	r|  ~|  }|d k	r|j  ~qT|  }t	s|d ks|j	r|d k	rd|_	|
d  W d S ~qTW n$ t k
r   tjjddd Y nX d S )NzException in initializer:T)exc_info)blockzException in worker)r   r   ZLOGGERZcritical_initializer_failedgetr   _idle_semaphorereleaser   r   )Zexecutor_referenceZ
work_queueinitializerinitargsZexecutor	work_itemr   r   r   _workerB   s8    

r(   c                   @   s   e Zd ZdZdS )BrokenThreadPoolzR
    Raised when a worker thread in a ThreadPoolExecutor failed initializing.
    N)r   r   r   __doc__r   r   r   r   r)   m   s   r)   c                   @   sf   e Zd Ze jZdddZdd Ze	j
jje_e	j
jje_dd	 Zd
d ZdddZe	j
jje_dS )ThreadPoolExecutorN r   c                 C   s   |dkrt dt pdd }|dkr.td|dk	rFt|sFtd|| _t | _	t
d| _t | _d| _d| _t
 | _|pd	|   | _|| _|| _dS )
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          r   z"max_workers must be greater than 0zinitializer must be a callableFzThreadPoolExecutor-%d)minos	cpu_count
ValueErrorcallable	TypeError_max_workersqueueZSimpleQueue_work_queue	threadingZ	Semaphorer#   set_threads_brokenr   ZLock_shutdown_lock_counter_thread_name_prefix_initializer	_initargs)r   Zmax_workersZthread_name_prefixr%   r&   r   r   r   r   x   s$    


zThreadPoolExecutor.__init__c               
   O   s   t | dkr| ^}}} nV| s&tdnHd|krZ|d}| ^}} dd l}|jdtdd ntdt | d  |jf |jrt|j|j	rt
d	t	rt
d
t }t||| |}|j| |  |W  5 Q R  S Q R X d S )N   zDdescriptor 'submit' of 'ThreadPoolExecutor' object needs an argumentr   r   z.Passing 'fn' as keyword argument is deprecated)
stacklevelz6submit expected at least 1 positional argument, got %dr.   z*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdown)lenr5   popwarningswarnDeprecationWarningr=   r<   r)   r   RuntimeErrorr   ZFuturer   r8   r   _adjust_thread_count)r   r   r   r   rF   fwr   r   r   submit   s6    

 

zThreadPoolExecutor.submitc                 C   s   | j jddrd S | jfdd}t| j}|| jk rd| jp>| |f }tj|t	t
| || j| j| jfd}d|_|  | j| | jt|< d S )Nr   )Ztimeoutc                 S   s   | d  d S r   )r   )_r   r   r   r   
weakref_cb   s    z;ThreadPoolExecutor._adjust_thread_count.<locals>.weakref_cbz%s_%d)nametargetr   T)r#   acquirer8   rD   r;   r6   r?   r9   ZThreadr(   weakrefrefr@   rA   Zdaemonstartaddr   )r   rO   Znum_threadsZthread_namer
   r   r   r   rJ      s&    



z'ThreadPoolExecutor._adjust_thread_countc              	   C   sb   | j R d| _z| j }W n tjk
r6   Y qTY nX |d k	r|jt| j qW 5 Q R X d S )NzBA thread initializer failed, the thread pool is not usable anymore)	r=   r<   r8   Z
get_nowaitr7   ZEmptyr   r   r)   )r   r'   r   r   r   r!      s    
z&ThreadPoolExecutor._initializer_failedTc              	   C   s@   | j  d| _| jd  W 5 Q R X |r<| jD ]}|  q.d S r   )r=   r   r8   r   r;   r	   )r   waitr
   r   r   r   shutdown   s    
zThreadPoolExecutor.shutdown)Nr,   Nr   )T)r   r   r   	itertoolscount__next__r>   r   rM   r   Executor__text_signature__r*   rJ   r!   rX   r   r   r   r   r+   s   s   
    
& 
r+   )r*   
__author__ZatexitZconcurrent.futuresr   rY   r7   r9   rS   r1   WeakKeyDictionaryr   r   r   registerobjectr   r(   ZBrokenExecutorr)   r\   r+   r   r   r   r   <module>   s    	
+