
W                 @   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 e j	   Z
 d a d d   Z e j e  Gd d	   d	 e  Z d
 d   Z Gd d   d e j  Z d S)zImplements ThreadPoolExecutor.z"Brian Quinlan (brian@sweetapp.com)    N)_baseFc              C   sa   d a  t t j    }  x! |  D] \ } } | j d   q Wx |  D] \ } } | j   qC Wd  S)NT)	_shutdownlist_threads_queuesitemsputjoin)r   tq r   ;/afs/.cs/s/python-3.5.2/amd64_ubu14/lib/python3.5/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   s{   |  j  j   s d  Sy |  j |  j |  j   } Wn5 t k
 rf } z |  j  j |  WYd  d  } ~ Xn X|  j  j |  d  S)N)r   set_running_or_notify_cancelr   r   r   BaseExceptionset_exception
set_result)r   resulter   r   r   run2   s    #z_WorkItem.runN)__name__
__module____qualname__r   r   r   r   r   r   r   +   s   r   c             C   s   yq xj | j  d d  } | d  k	 r4 | j   ~ q |    } t sX | d  k sX | j ri | j d   d  S~ q WWn( t k
 r t j j d d d Yn Xd  S)NblockTzException in workerexc_info)getr   r   r   r   r   LOGGERcritical)executor_reference
work_queue	work_itemexecutorr   r   r   _worker=   s    
	r(   c               @   sj   e  Z d  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)ThreadPoolExecutorNc             C   sz   | d k r" t  j   p d d } | d k r: t d   | |  _ t j   |  _ t   |  _ d |  _	 t
 j   |  _ d S)zInitializes a new ThreadPoolExecutor instance.

        Args:
            max_workers: The maximum number of threads that can be used to
                execute the given calls.
        N      r   z"max_workers must be greater than 0F)os	cpu_count
ValueError_max_workersqueueQueue_work_queueset_threadsr   	threadingLock_shutdown_lock)r   max_workersr   r   r   r   T   s    		zThreadPoolExecutor.__init__c             O   si   |  j  Y |  j r t d   t j   } t | | | |  } |  j j |  |  j   | SWd  QRXd  S)Nz*cannot schedule new futures after shutdown)	r7   r   RuntimeErrorr   Futurer   r2   r   _adjust_thread_count)r   r   r   r   fwr   r   r   submith   s    
	
zThreadPoolExecutor.submitc             C   s   |  j  d d  } t |  j  |  j k  r t j d t d t j |  |  |  j  f  } d | _	 | j
   |  j j |  |  j  t | <d  S)Nc             S   s   | j  d   d  S)N)r   )_r
   r   r   r   
weakref_cbx   s    z;ThreadPoolExecutor._adjust_thread_count.<locals>.weakref_cbtargetr   T)r2   lenr4   r/   r5   Threadr(   weakrefrefdaemonstartaddr   )r   r@   r	   r   r   r   r;   u   s    	
z'ThreadPoolExecutor._adjust_thread_countTc          	   C   sR   |  j   d |  _ |  j j d   Wd  QRX| rN x |  j D] } | j   q: Wd  S)NT)r7   r   r2   r   r4   r   )r   waitr	   r   r   r   shutdown   s    
	zThreadPoolExecutor.shutdown)
r   r   r   r   r>   r   Executor__doc__r;   rJ   r   r   r   r   r)   S   s   r)   )rL   
__author__atexitconcurrent.futuresr   r0   r5   rD   r,   WeakKeyDictionaryr   r   r   registerobjectr   r(   rK   r)   r   r   r   r   <module>   s   	