U
    /e                     @  s   U d Z ddlmZ dZddlZddlZddlZddlZddlZddl	Z	ddl
mZ e	 Zded< dad	d
 Zee G dd dZdd ZG dd dejZdS )zImplements ThreadPoolExecutor.    )annotationsz"Brian Quinlan (brian@sweetapp.com)N)_basez8weakref.WeakKeyDictionary[threading.Thread, queue.Queue]_threads_queuesFc                  C  sB   da tt } | D ]\}}|d  q| D ]\}}|  q,d S NT)	_shutdownlistr   itemsputjoin)r   tq r   J/tmp/pip-unpacked-wheel-g426oqom/distributed/_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__6   s    z_WorkItem.__init__c              
   C  sb   | j  sd S z| j| j| j}W n. tk
rP } z| j | W 5 d }~X Y nX | j | d S r   )r   Zset_running_or_notify_cancelr   r   r   BaseExceptionZset_exceptionZ
set_result)r   resulter   r   r   run<   s    
z_WorkItem.runN)__name__
__module____qualname__r   r   r   r   r   r   r   5   s   r   c                 C  sz   zP|j dd}|d k	r"|  ~q|  }ts:|d ks:|jrJ|d  W d S ~qW n$ tk
rt   tjjddd Y nX d S )NT)blockzException in worker)exc_info)getr   r   r	   r   r   ZLOGGERcritical)Zexecutor_referenceZ
work_queueZ	work_itemexecutorr   r   r   _workerH   s    
r$   c                   @  sP   e Zd Ze ZdddZdd Zej	jj
e_
dd Zdd
dZej	jj
e_
dS )ThreadPoolExecutorN c                 C  sh   |dkrt  pdd }|dkr(td|| _t | _t | _d| _	t
 | _|p`dt| j | _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.
        N      r   z"max_workers must be greater than 0FzThreadPoolExecutor-%d)os	cpu_count
ValueError_max_workersqueueQueue_work_queueset_threadsr   	threadingLock_shutdown_locknext_counter_thread_name_prefix)r   max_workersZthread_name_prefixr   r   r   r   d   s    

zThreadPoolExecutor.__init__c              
   O  sZ   | j J | jrtdt }t||||}| j| |   |W  5 Q R  S Q R X d S )Nz*cannot schedule new futures after shutdown)	r4   r   RuntimeErrorr   ZFuturer   r/   r	   _adjust_thread_count)r   r   r   r   fwr   r   r   submit|   s    zThreadPoolExecutor.submitc                 C  sz   | j fdd}t| j}|| jk rvd| jp,| |f }tj|tt	| || j fd}d|_
|  | j| | j t|< d S )Nc                 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/   lenr1   r,   r7   r2   Threadr$   weakrefrefdaemonstartaddr   )r   r?   Znum_threadsZthread_namer   r   r   r   r:      s    

z'ThreadPoolExecutor._adjust_thread_countTc              	   C  s@   | j  d| _| jd  W 5 Q R X |r<| jD ]}|  q.d S r   )r4   r   r/   r	   r1   r
   )r   waitr   r   r   r   shutdown   s    
zThreadPoolExecutor.shutdown)Nr&   )T)r   r   r   	itertoolscountr6   r   r=   r   Executor__doc__r:   rJ   r   r   r   r   r%   _   s   

r%   )rN   
__future__r   
__author__atexitrK   r)   r-   r2   rD   concurrent.futuresr   WeakKeyDictionaryr   __annotations__r   r   registerr   r$   rM   r%   r   r   r   r   <module>   s"   


