B
    v9aBU              
   @   s`  d Z ddlZddlZddlZddlZdZdZdZdZdZ	dZ
d	Zd
ZdZe	e
eeegZe	de
dededediZedZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZd!d" Zd#d$ Zd1d%d&Zed'd(Z defd)d*Z!G d+d, d,eZ"G d-d. d.eZ#G d/d0 d0e$Z%dS )2z"Brian Quinlan (brian@sweetapp.com)    NFIRST_COMPLETEDFIRST_EXCEPTIONALL_COMPLETED_AS_COMPLETEDPENDINGRUNNING	CANCELLEDCANCELLED_AND_NOTIFIEDFINISHEDpendingrunning	cancelledfinishedzconcurrent.futuresc               @   s   e Zd ZdS )ErrorN)__name__
__module____qualname__ r   r   /usr/lib/python3.7/_base.pyr   ,   s   r   c               @   s   e Zd ZdS )CancelledErrorN)r   r   r   r   r   r   r   r   0   s   r   c               @   s   e Zd ZdS )TimeoutErrorN)r   r   r   r   r   r   r   r   4   s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_Waiterc             C   s   t  | _g | _d S )N)	threadingZEventeventfinished_futures)selfr   r   r   __init__:   s    
z_Waiter.__init__c             C   s   | j | d S )N)r   append)r   futurer   r   r   
add_result>   s    z_Waiter.add_resultc             C   s   | j | d S )N)r   r   )r   r   r   r   r   add_exceptionA   s    z_Waiter.add_exceptionc             C   s   | j | d S )N)r   r   )r   r   r   r   r   add_cancelledD   s    z_Waiter.add_cancelledN)r   r   r   r   r   r    r!   r   r   r   r   r   8   s   r   c                   s@   e Zd Z fddZ fddZ fddZ fddZ  ZS )	_AsCompletedWaiterc                s   t t|   t | _d S )N)superr"   r   r   Locklock)r   )	__class__r   r   r   J   s    z_AsCompletedWaiter.__init__c          	      s0   | j   tt| | | j  W d Q R X d S )N)r%   r#   r"   r   r   set)r   r   )r&   r   r   r   N   s    z_AsCompletedWaiter.add_resultc          	      s0   | j   tt| | | j  W d Q R X d S )N)r%   r#   r"   r    r   r'   )r   r   )r&   r   r   r    S   s    z _AsCompletedWaiter.add_exceptionc          	      s0   | j   tt| | | j  W d Q R X d S )N)r%   r#   r"   r!   r   r'   )r   r   )r&   r   r   r!   X   s    z _AsCompletedWaiter.add_cancelled)r   r   r   r   r   r    r!   __classcell__r   r   )r&   r   r"   G   s   r"   c                   s4   e Zd Z fddZ fddZ fddZ  ZS )_FirstCompletedWaiterc                s   t  | | j  d S )N)r#   r   r   r'   )r   r   )r&   r   r   r   `   s    z _FirstCompletedWaiter.add_resultc                s   t  | | j  d S )N)r#   r    r   r'   )r   r   )r&   r   r   r    d   s    z#_FirstCompletedWaiter.add_exceptionc                s   t  | | j  d S )N)r#   r!   r   r'   )r   r   )r&   r   r   r!   h   s    z#_FirstCompletedWaiter.add_cancelled)r   r   r   r   r    r!   r(   r   r   )r&   r   r)   ]   s   r)   c                   sH   e Zd Z fddZdd Z fddZ fddZ fd	d
Z  ZS )_AllCompletedWaiterc                s$   || _ || _t | _t   d S )N)num_pending_callsstop_on_exceptionr   r$   r%   r#   r   )r   r+   r,   )r&   r   r   r   o   s    
z_AllCompletedWaiter.__init__c          	   C   s4   | j $ |  jd8  _| js&| j  W d Q R X d S )N   )r%   r+   r   r'   )r   r   r   r   _decrement_pending_callsu   s    z,_AllCompletedWaiter._decrement_pending_callsc                s   t  | |   d S )N)r#   r   r.   )r   r   )r&   r   r   r   {   s    z_AllCompletedWaiter.add_resultc                s*   t  | | jr| j  n|   d S )N)r#   r    r,   r   r'   r.   )r   r   )r&   r   r   r       s    z!_AllCompletedWaiter.add_exceptionc                s   t  | |   d S )N)r#   r!   r.   )r   r   )r&   r   r   r!      s    z!_AllCompletedWaiter.add_cancelled)	r   r   r   r   r.   r   r    r!   r(   r   r   )r&   r   r*   l   s
   r*   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_AcquireFuturesc             C   s   t |td| _d S )N)key)sortedidfutures)r   r3   r   r   r   r      s    z_AcquireFutures.__init__c             C   s   x| j D ]}|j  qW d S )N)r3   
_conditionacquire)r   r   r   r   r   	__enter__   s    z_AcquireFutures.__enter__c             G   s   x| j D ]}|j  qW d S )N)r3   r4   release)r   argsr   r   r   r   __exit__   s    z_AcquireFutures.__exit__N)r   r   r   r   r6   r9   r   r   r   r   r/      s   r/   c             C   s   |t krt }nZ|tkr t }nJtdd | D }|tkrHt|dd}n"|tkr^t|dd}ntd| x| D ]}|j	
| qpW |S )Nc             s   s   | ]}|j ttgkV  qd S )N)_stater	   r
   ).0fr   r   r   	<genexpr>   s    z._create_and_install_waiters.<locals>.<genexpr>T)r,   FzInvalid return condition: %r)r   r"   r   r)   sumr   r*   r   
ValueError_waitersr   )fsreturn_whenwaiterZpending_countr<   r   r   r   _create_and_install_waiters   s    
rD   c          	   c   sX   xR| rR| d }x|D ]}| | qW |j |j | W d Q R X ~|  V  qW d S )N)remover4   r@   pop)rA   rC   ref_collectr<   Zfutures_setr   r   r   _yield_finished_futures   s    
rI   c       	      c   sJ  |d k	r|t   }t| } t| }t| * tdd | D }| | }t| t}W d Q R X t|}zt||| fdE d H  x|r|d krd }n(|t   }|dk rt	dt||f |j
| |j |j}g |_|j
  W d Q R X |  t||| |fdE d H  q~W W d x,| D ]$}|j |j| W d Q R X qW X d S )Nc             s   s    | ]}|j ttgkr|V  qd S )N)r:   r	   r
   )r;   r<   r   r   r   r=      s    zas_completed.<locals>.<genexpr>)rH   r   z%d (of %d) futures unfinished)time	monotonicr'   lenr/   rD   r   listrI   r   r   waitr%   r   clearreverser4   r@   rF   )	rA   timeoutend_timeZtotal_futuresr   r   rC   Zwait_timeoutr<   r   r   r   as_completed   s@    

rS   DoneAndNotDoneFutureszdone not_donec          
   C   s   t |  tdd | D }t| | }|tkr>|r>t||S |tkrf|rftdd |D rft||S t|t| krt||S t| |}W d Q R X |j	| x*| D ]"}|j
 |j| W d Q R X qW ||j t|t| | S )Nc             s   s    | ]}|j ttgkr|V  qd S )N)r:   r	   r
   )r;   r<   r   r   r   r=     s    zwait.<locals>.<genexpr>c             s   s&   | ]}|  s| d k	r|V  qd S )N)r   	exception)r;   r<   r   r   r   r=   $  s    )r/   r'   r   rT   r   anyrL   rD   r   rN   r4   r@   rF   updater   )rA   rQ   rB   doneZnot_donerC   r<   r   r   r   rN     s"    




rN   c               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdddZdddZdd Zdd Zdd ZdS ) Futurec             C   s,   t  | _t| _d | _d | _g | _g | _d S )N)	r   Z	Conditionr4   r   r:   _result
_exceptionr@   _done_callbacks)r   r   r   r   r   8  s    
zFuture.__init__c          	   C   sB   x<| j D ]2}y||  W q tk
r8   td|  Y qX qW d S )Nz!exception calling callback for %r)r\   	ExceptionLOGGERrU   )r   callbackr   r   r   _invoke_callbacksA  s
    zFuture._invoke_callbacksc          	   C   s   | j v | jtkr`| jr<d| jjt| t| j | jjjf S d| jjt| t| j | jjjf S d| jjt| t| j f S Q R X d S )Nz<%s at %#x state=%s raised %s>z <%s at %#x state=%s returned %s>z<%s at %#x state=%s>)	r4   r:   r
   r[   r&   r   r2   _STATE_TO_DESCRIPTION_MAPrZ   )r   r   r   r   __repr__H  s"    
zFuture.__repr__c          	   C   sR   | j : | jttgkrdS | jttgkr,dS t| _| j   W d Q R X |   dS )NFT)r4   r:   r   r
   r   r	   
notify_allr`   )r   r   r   r   cancel\  s    zFuture.cancelc          	   C   s    | j  | jttgkS Q R X d S )N)r4   r:   r   r	   )r   r   r   r   r   o  s    zFuture.cancelledc          	   C   s   | j  | jtkS Q R X d S )N)r4   r:   r   )r   r   r   r   r   t  s    zFuture.runningc          	   C   s"   | j  | jtttgkS Q R X d S )N)r4   r:   r   r	   r
   )r   r   r   r   rX   y  s    zFuture.donec             C   s   | j r| j n| jS d S )N)r[   rZ   )r   r   r   r   Z__get_result~  s    zFuture.__get_resultc          	   C   sd   | j & | jtttgkr(| j| d S W d Q R X y||  W n  tk
r^   t	d|  Y nX d S )Nz!exception calling callback for %r)
r4   r:   r   r	   r
   r\   r   r]   r^   rU   )r   fnr   r   r   add_done_callback  s    zFuture.add_done_callbackNc          	   C   sx   | j h | jttgkrt n| jtkr0|  S | j | | jttgkrRt n| jtkrd|  S t W d Q R X d S )N)	r4   r:   r   r	   r   r
   _Future__get_resultrN   r   )r   rQ   r   r   r   result  s    

zFuture.resultc          	   C   st   | j d | jttgkrt n| jtkr.| jS | j | | jttgkrPt n| jtkr`| jS t W d Q R X d S )N)	r4   r:   r   r	   r   r
   r[   rN   r   )r   rQ   r   r   r   rU     s    

zFuture.exceptionc          	   C   st   | j d | jtkr6t| _x| jD ]}||  q W dS | jtkrJt| _dS t	dt
| | j tdW d Q R X d S )NFTz!Future %s in unexpected state: %szFuture in unexpected state)r4   r:   r   r	   r@   r!   r   r   r^   Zcriticalr2   RuntimeError)r   rC   r   r   r   set_running_or_notify_cancel  s    

z#Future.set_running_or_notify_cancelc          	   C   sN   | j 6 || _t| _x| jD ]}||  qW | j   W d Q R X |   d S )N)r4   rZ   r
   r:   r@   r   rc   r`   )r   rh   rC   r   r   r   
set_result  s    zFuture.set_resultc          	   C   sN   | j 6 || _t| _x| jD ]}||  qW | j   W d Q R X |   d S )N)r4   r[   r
   r:   r@   r    rc   r`   )r   rU   rC   r   r   r   set_exception  s    zFuture.set_exception)N)N)r   r   r   r   r`   rb   rd   r   r   rX   rg   rf   rh   rU   rj   rk   rl   r   r   r   r   rY   5  s   	

"(rY   c               @   s>   e Zd Zdd ZdddddZdd	d
Zdd Zdd ZdS )Executorc              O   sB   t | dkrn*| stdnd|kr8tdt | d  t d S )N   z:descriptor 'submit' of 'Executor' object needs an argumentre   z6submit expected at least 1 positional argument, got %dr-   )rL   	TypeErrorNotImplementedError)r8   kwargsr   r   r   submit  s    	
zExecutor.submitNr-   )rQ   	chunksizec               sB   d k	rt    fddt| D  fdd}| S )Nc                s   g | ]}j  f| qS r   )rr   )r;   r8   )re   r   r   r   
<listcomp>K  s    z Executor.map.<locals>.<listcomp>c           	   3   sd   zF   x8rBd kr(  V  q  t  V  qW W d xD ]} |   qNW X d S )N)rP   rG   rh   rJ   rK   rd   )r   )rR   rA   rQ   r   r   result_iteratorO  s     
z%Executor.map.<locals>.result_iterator)rJ   rK   zip)r   re   rQ   rs   	iterablesru   r   )rR   re   rA   r   rQ   r   map2  s
    zExecutor.mapTc             C   s   d S )Nr   )r   rN   r   r   r   shutdown^  s    zExecutor.shutdownc             C   s   | S )Nr   )r   r   r   r   r6   k  s    zExecutor.__enter__c             C   s   | j dd dS )NT)rN   F)ry   )r   exc_typeZexc_valZexc_tbr   r   r   r9   n  s    zExecutor.__exit__)T)r   r   r   rr   rx   ry   r6   r9   r   r   r   r   rm     s
   ,
rm   c               @   s   e Zd ZdS )BrokenExecutorN)r   r   r   r   r   r   r   r{   s  s   r{   )N)&
__author__collectionsZloggingr   rJ   r   r   r   r   r   r   r   r	   r
   Z_FUTURE_STATESra   Z	getLoggerr^   r]   r   r   r   objectr   r"   r)   r*   r/   rD   rI   rS   
namedtuplerT   rN   rY   rm   ri   r{   r   r   r   r   <module>   sT   

>1 gX