
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \‡  ã               @   sŒ   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j	ƒ Z
dadd„ Zejeƒ G dd„ deƒZd	d
„ ZG dd„ dejƒZdS )z"Brian Quinlan (brian@sweetapp.com)é    N)Ú_baseFc              C   sJ   da ttjƒ ƒ} x| D ]\}}|jd ƒ qW x| D ]\}}|jƒ  q2W d S )NT)Ú	_shutdownÚlistÚ_threads_queuesÚitemsÚputÚjoin)r   ÚtÚq© r   ú1/usr/lib64/python3.6/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 jƒ sd S y| j| j| jŽ}W n2 tk
rT } z| j j|ƒ d } W Y d d }~X nX | j j|ƒ d S )N)r   Zset_running_or_notify_cancelr   r   r   ÚBaseExceptionZset_exceptionZ
set_result)r   ÚresultÚexcr   r   r   Úrun3   s    
z_WorkItem.runN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   ,   s   r   c             C   s|   yRxL|j dd�}|d k	r$|jƒ  ~q| ƒ }ts<|d ks<|jrJ|jd ƒ d S ~qW W n$ tk
rv   tjjddd� Y nX d S )NT)ÚblockzException in worker)Úexc_info)Úgetr   r   r   r   r   ZLOGGERZcritical)Zexecutor_referenceZ
work_queueZ	work_itemZexecutorr   r   r   Ú_worker@   s    

r   c               @   sR   e Zd Zejƒ j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   sf   |d krt jƒ pdd }|dkr(tdƒ‚|| _tjƒ | _tƒ | _d| _	t
jƒ | _|p^d| jƒ  | _d S )Né   é   r   z"max_workers must be greater than 0FzThreadPoolExecutor-%d)ÚosÚ	cpu_countÚ
ValueErrorÚ_max_workersÚqueueZQueueÚ_work_queueÚsetÚ_threadsr   Ú	threadingZLockÚ_shutdown_lockÚ_counterÚ_thread_name_prefix)r   Zmax_workersZthread_name_prefixr   r   r   r   [   s    

zThreadPoolExecutor.__init__c             O   sN   | j �> | jrtdƒ‚tjƒ }t||||ƒ}| jj|ƒ | jƒ  |S Q R X d S )Nz*cannot schedule new futures after shutdown)	r-   r   ÚRuntimeErrorr   ZFuturer   r)   r   Ú_adjust_thread_count)r   r   r   r   ÚfÚwr   r   r   Úsubmitr   s    zThreadPoolExecutor.submitc             C   sz   | j fdd„}t| jƒ}|| jk rvd| jp,| |f }tj|ttj	| |ƒ| j fd�}d|_
|jƒ  | jj|ƒ | j t|< d S )Nc             S   s   |j d ƒ d S )N)r   )Ú_r
   r   r   r   Ú
weakref_cb‚   s    z;ThreadPoolExecutor._adjust_thread_count.<locals>.weakref_cbz%s_%d)ÚnameÚtargetr   T)r)   Úlenr+   r'   r/   r,   ZThreadr   ÚweakrefÚrefZdaemonÚstartÚaddr   )r   r6   Znum_threadsZthread_namer	   r   r   r   r1      s    



z'ThreadPoolExecutor._adjust_thread_countTc          	   C   sD   | j � d| _| jjd ƒ W d Q R X |r@x| jD ]}|jƒ  q0W d S )NT)r-   r   r)   r   r+   r   )r   Úwaitr	   r   r   r   Úshutdown’   s    zThreadPoolExecutor.shutdown)Nr!   )T)r   r   r   Ú	itertoolsÚcountÚ__next__r.   r   r4   r   ÚExecutorÚ__doc__r1   r?   r   r   r   r   r    V   s   


r    )Ú
__author__ÚatexitZconcurrent.futuresr   r@   r(   r,   r:   r$   ÚWeakKeyDictionaryr   r   r   ÚregisterÚobjectr   r   rC   r    r   r   r   r   Ú<module>   s   	
