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

  \äa  ã               @   s¾  d ddddddddd	d
ddg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 ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddl
mZ G dd „ d ejƒZeZyddlZW n ek
rÄ   Y nX ej ZZejjZejjZejjZeddedœdd„ƒZdd„ Zeddœdd„ƒZedd„ ƒZdddœd d„Zed.ddœd!d„ƒZddœd"d#„Zeeƒ d< de_[ddœd$d„Z ed%d&„ ƒZ!G d'd(„ d(ejƒZ"dd)d*œd+d	„Z#ddœd,d
„Z$d-d„ Z%dS )/ÚTaskÚFIRST_COMPLETEDÚFIRST_EXCEPTIONÚALL_COMPLETEDÚwaitÚwait_forÚas_completedÚsleepÚasyncÚgatherÚshieldÚensure_futureÚrun_coroutine_threadsafeé    Né   )Ú
base_tasks)Úcompat)Ú
coroutines)Úevents)Úfutures)Ú	coroutinec                   s    e Zd Zejƒ Zi ZdZeddd„ƒZ	eddd„ƒZ
ddœ‡ fdd	„
ZejrTd
d„ Zdd„ Zddœdd„Zdddœdd„Zdd„ Zd‡ fdd„	Zdd„ Z‡  ZS )r   TNc             C   s   |d krt jƒ }| jj|ƒS )N)r   Úget_event_loopÚ_current_tasksÚget)ÚclsÚloop© r   ú%/usr/lib64/python3.6/asyncio/tasks.pyÚcurrent_task.   s    zTask.current_taskc                s$   ˆ d krt jƒ ‰ ‡ fdd„| jD ƒS )Nc                s   h | ]}|j ˆ kr|’qS r   )Ú_loop)Ú.0Út)r   r   r   ú	<setcomp>B   s    z!Task.all_tasks.<locals>.<setcomp>)r   r   Ú
_all_tasks)r   r   r   )r   r   Ú	all_tasks:   s    zTask.all_tasks)r   c               sN   t ƒ j|d� | jr| jd= || _d | _d| _| jj| jƒ | j	j
j| ƒ d S )N)r   r   Féÿÿÿÿ)ÚsuperÚ__init__Ú_source_tracebackÚ_coroÚ_fut_waiterÚ_must_cancelr   Ú	call_soonÚ_stepÚ	__class__r"   Úadd)ÚselfÚcoror   )r-   r   r   r&   D   s    zTask.__init__c             C   sH   | j tjkr8| jr8| ddœ}| jr,| j|d< | jj|ƒ tjj| ƒ d S )Nz%Task was destroyed but it is pending!)ÚtaskÚmessageZsource_traceback)	Z_stater   Z_PENDINGÚ_log_destroy_pendingr'   r   Zcall_exception_handlerÚFutureÚ__del__)r/   Úcontextr   r   r   r5   S   s    
zTask.__del__c             C   s
   t j| ƒS )N)r   Z_task_repr_info)r/   r   r   r   Ú
_repr_info^   s    zTask._repr_info)Úlimitc            C   s   t j| |ƒS )N)r   Z_task_get_stack)r/   r8   r   r   r   Ú	get_stacka   s    zTask.get_stack)r8   Úfilec            C   s   t j| ||ƒS )N)r   Z_task_print_stack)r/   r8   r:   r   r   r   Úprint_stackx   s    	zTask.print_stackc             C   s4   d| _ | jƒ rdS | jd k	r*| jjƒ r*dS d| _dS )NFT)Z_log_tracebackÚdoner)   Úcancelr*   )r/   r   r   r   r=   ƒ   s    

zTask.cancelc                sf  | j r t|tjƒstjƒ }d| _ | j}d | _| | jj| j< �zy"|d krT|j	d ƒ}n
|j
|ƒ}W nÈ tk
r¬ } z.| j rŽd| _ | jtjƒ ƒ n| j|jƒ W Y d d }~X �nœ tjk
rÌ   tƒ jƒ  Y �n| tk
rø } z| j|ƒ W Y d d }~X �nP tk
�r( } z| j|ƒ ‚ W Y d d }~X �n X t|dd ƒ}|d k	�rê|j| jk	�rl| jj| jtdj| |ƒƒƒ n||�rÌ|| k�r˜| jj| jtdj| ƒƒƒ n2d|_|j| jƒ || _| j �rè| jjƒ �rèd| _ n| jj| jtdj| |ƒƒƒ n^|d k�r| jj| jƒ nDtj|ƒ�r.| jj| jtdj| |ƒƒƒ n| jj| jtdj|ƒƒƒ W d | jjj| jƒ d } X d S )NFÚ_asyncio_future_blockingz6Task {!r} got Future {!r} attached to a different loopz!Task cannot await on itself: {!r}z;yield was used instead of yield from in task {!r} with {!r}zIyield was used instead of yield from for generator in task {!r} with {!r}zTask got bad yield: {!r})r*   Ú
isinstancer   ÚCancelledErrorr(   r)   r-   r   r   ÚsendÚthrowÚStopIterationÚset_exceptionÚ
set_resultÚvaluer%   r=   Ú	ExceptionÚBaseExceptionÚgetattrr+   r,   ÚRuntimeErrorÚformatr>   Úadd_done_callbackÚ_wakeupÚinspectZisgeneratorÚpop)r/   Úexcr0   ÚresultZblocking)r-   r   r   r,   ¤   s~    



z
Task._stepc             C   sJ   y|j ƒ  W n, tk
r8 } z| j|ƒ W Y d d }~X n
X | jƒ  d } d S )N)rQ   rG   r,   )r/   ÚfuturerP   r   r   r   rM   ø   s    zTask._wakeup)N)N)N)Ú__name__Ú
__module__Ú__qualname__ÚweakrefÚWeakSetr"   r   r3   Úclassmethodr   r#   r&   r   ZPY34r5   r7   r9   r;   r=   r,   rM   Ú__classcell__r   r   )r-   r   r      s    	!T)r   ÚtimeoutÚreturn_whenc            #   sˆ   t j| ƒstj| ƒr&tdt| ƒj ƒ‚| s2tdƒ‚|tt	t
fkrNtdj|ƒƒ‚ˆ d kr^tjƒ ‰ ‡ fdd„t| ƒD ƒ} t| ||ˆ ƒE d H S )Nz expect a list of futures, not %sz#Set of coroutines/Futures is empty.zInvalid return_when value: {}c                s   h | ]}t |ˆ d �’qS ))r   )r   )r   Úf)r   r   r   r!   7  s    zwait.<locals>.<setcomp>)r   Úisfuturer   ÚiscoroutineÚ	TypeErrorÚtyperS   Ú
ValueErrorr   r   r   rK   r   r   ÚsetÚ_wait)Úfsr   rZ   r[   r   )r   r   r     s    c             G   s   | j ƒ s| jd ƒ d S )N)r<   rE   )ÚwaiterÚargsr   r   r   Ú_release_waiter<  s    rg   )r   c            c   sÒ   |d krt jƒ }|d kr"| E d H S |jƒ }|j|t|ƒ}tjt|ƒ}t| |d�} | j|ƒ zhy|E d H  W n* t	j
k
r”   | j|ƒ | jƒ  ‚ Y nX | jƒ r¦| jƒ S | j|ƒ | jƒ  t	jƒ ‚W d |jƒ  X d S )N)r   )r   r   Úcreate_futureÚ
call_laterrg   Ú	functoolsÚpartialr   rL   r   r@   Úremove_done_callbackr=   r<   rQ   ÚTimeoutError)ÚfutrZ   r   re   Útimeout_handleÚcbr   r   r   r   A  s,    



c             #   sÂ   |j ƒ ‰d ‰|d k	r"|j|tˆƒ‰t| ƒ‰ ‡ ‡‡‡fdd„}x| D ]}|j|ƒ qBW zˆE d H  W d ˆd k	rtˆjƒ  X tƒ tƒ  }}x4| D ],}|j|ƒ |jƒ r¬|j	|ƒ qŠ|j	|ƒ qŠW ||fS )Nc                s\   ˆ d8 ‰ ˆ dks6ˆt ks6ˆtkrX| jƒ  rX| jƒ d k	rXˆd k	rFˆjƒ  ˆjƒ sXˆjd ƒ d S )Nr   r   )r   r   Ú	cancelledÚ	exceptionr=   r<   rE   )r\   )Úcounterr[   ro   re   r   r   Ú_on_completion|  s    z_wait.<locals>._on_completion)
rh   ri   rg   ÚlenrL   r=   rb   rl   r<   r.   )rd   rZ   r[   r   rt   r\   r<   Úpendingr   )rs   r[   ro   re   r   rc   o  s&    



rc   )r   rZ   c            #   sì   t j| ƒstj| ƒr&tdt| ƒj ƒ‚ˆd k	r2ˆntjƒ ‰‡fdd„t	| ƒD ƒ‰ddl
m} |ˆd�‰d ‰‡ ‡‡fdd„}‡‡‡fd	d
„‰ t‡fdd„ƒ}xˆD ]}|jˆ ƒ q W ˆrÊ|d k	rÊˆj||ƒ‰xttˆƒƒD ]}|ƒ V  qØW d S )Nz expect a list of futures, not %sc                s   h | ]}t |ˆ d �’qS ))r   )r   )r   r\   )r   r   r   r!   ±  s    zas_completed.<locals>.<setcomp>r   )ÚQueue)r   c                 s.   x ˆD ]} | j ˆ ƒ ˆjd ƒ qW ˆjƒ  d S )N)rl   Ú
put_nowaitÚclear)r\   )rt   r<   Útodor   r   Ú_on_timeout¶  s    

z!as_completed.<locals>._on_timeoutc                s6   ˆsd S ˆj | ƒ ˆ j| ƒ ˆ r2ˆd k	r2ˆjƒ  d S )N)Úremoverx   r=   )r\   )r<   ro   rz   r   r   rt   ¼  s    

z$as_completed.<locals>._on_completionc              3   s$   ˆ j ƒ E d H } | d krtj‚| jƒ S )N)r   r   rm   rQ   )r\   )r<   r   r   Ú_wait_for_oneÄ  s    z#as_completed.<locals>._wait_for_one)r   r]   r   r^   r_   r`   rS   r   r   rb   Zqueuesrw   r   rL   ri   Úrangeru   )rd   r   rZ   rw   r{   r}   r\   Ú_r   )rt   r<   r   ro   rz   r   r   œ  s     

c         
   c   sX   | dkrd V  |S |d kr"t jƒ }|jƒ }|jj| tj||ƒ}z
|E d H S |jƒ  X d S )Nr   )r   r   rh   r   ri   r   Z_set_result_unless_cancelledr=   )ZdelayrQ   r   rR   Úhr   r   r   r   Ô  s    
c            C   s   t jdtdd� t| |d�S )Nz;asyncio.async() function is deprecated, use ensure_future()é   )Ú
stacklevel)r   )ÚwarningsÚwarnÚDeprecationWarningr   )Úcoro_or_futurer   r   r   r   Úasync_ç  s    r‡   c            C   sŠ   t j| ƒr(|d k	r$|| jk	r$tdƒ‚| S tj| ƒr^|d krBtjƒ }|j| ƒ}|j	rZ|j	d= |S t
jr~tj| ƒr~tt| ƒ|d�S tdƒ‚d S )Nz$loop argument must agree with Futurer   )r   z:An asyncio.Future, a coroutine or an awaitable is requiredr$   )r   r]   r   ra   r   r^   r   r   Zcreate_taskr'   r   ZPY35rN   Zisawaitabler   Ú_wrap_awaitabler_   )r†   r   r1   r   r   r   r   û  s    


c             c   s   | j ƒ E d H S )N)Ú	__await__)Z	awaitabler   r   r   rˆ     s    rˆ   c                   s*   e Zd Zddœ‡ fdd„
Zdd„ Z‡  ZS )Ú_GatheringFutureN)r   c               s   t ƒ j|d� || _d| _d S )N)r   F)r%   r&   Ú	_childrenÚ_cancel_requested)r/   Úchildrenr   )r-   r   r   r&   $  s    z_GatheringFuture.__init__c             C   s:   | j ƒ rdS d}x| jD ]}|jƒ rd}qW |r6d| _|S )NFT)r<   r‹   r=   rŒ   )r/   ZretZchildr   r   r   r=   )  s    z_GatheringFuture.cancel)rS   rT   rU   r&   r=   rY   r   r   )r-   r   rŠ     s   rŠ   F)r   Úreturn_exceptionsc                s  |s*| d krt jƒ } | jƒ ‰ˆjg ƒ ˆS i ‰ xjt|ƒD ]^}tj|ƒsht|| d�}| d kr`|j} d|_	n&|}| d kr||j} n|j| k	rŽt
dƒ‚|ˆ |< q8W ‡ fdd„|D ƒ}t|ƒ‰t|| d�‰d‰d gˆ ‰‡‡‡‡‡fdd„}x&t|ƒD ]\}}|jtj||ƒƒ qìW ˆS )	N)r   Fz)futures are tied to different event loopsc                s   g | ]}ˆ | ‘qS r   r   )r   Úarg)Ú
arg_to_futr   r   ú
<listcomp>h  s    zgather.<locals>.<listcomp>r   c                s¨   ˆj ƒ r|jƒ s|jƒ  d S |jƒ r@tjƒ }ˆslˆj|ƒ d S n,|jd k	rf|jƒ }ˆslˆj|ƒ d S n|j}|ˆ| < ˆd7 ‰ˆˆ kr¤ˆjršˆjtjƒ ƒ n
ˆj	ˆƒ d S )Nr   )
r<   rq   rr   r   r@   rD   Z
_exceptionZ_resultrŒ   rE   )Úirn   Úres)Ú	nchildrenÚ	nfinishedÚouterÚresultsrŽ   r   r   Ú_done_callbackn  s*    


zgather.<locals>._done_callback)r   r   rh   rE   rb   r   r]   r   r   r3   ra   ru   rŠ   Ú	enumeraterL   rj   rk   )r   rŽ   Zcoros_or_futuresr�   rn   r�   r˜   r’   r   )r�   r”   r•   r–   r—   rŽ   r   r
   8  s8    



c               s@   t | |d�}|jƒ r|S |j}|jƒ ‰ ‡ fdd„}|j|ƒ ˆ S )N)r   c                s\   ˆ j ƒ r| j ƒ s| jƒ  d S | j ƒ r.ˆ jƒ  n*| jƒ }|d k	rJˆ j|ƒ nˆ j| jƒ ƒ d S )N)rq   rr   r=   rD   rE   rQ   )ÚinnerrP   )r–   r   r   r˜   °  s    
zshield.<locals>._done_callback)r   r<   r   rh   rL   )r�   r   rš   r˜   r   )r–   r   r   �  s    
c                s:   t jˆ ƒstdƒ‚tjjƒ ‰‡ ‡‡fdd„}ˆj|ƒ ˆS )NzA coroutine object is requiredc                 sT   yt jtˆ ˆd�ˆƒ W n6 tk
rN }  zˆjƒ r<ˆj| ƒ ‚ W Y d d } ~ X nX d S )N)r   )r   Z_chain_futurer   rG   Zset_running_or_notify_cancelrD   )rP   )r0   rR   r   r   r   ÚcallbackÍ  s    
z*run_coroutine_threadsafe.<locals>.callback)r   r^   r_   Ú
concurrentr   r4   Zcall_soon_threadsafe)r0   r   r›   r   )r0   rR   r   r   r   Ä  s    


)N)&Ú__all__Zconcurrent.futuresrœ   rj   rN   rƒ   rV   Ú r   r   r   r   r   r   r4   r   Z_PyTaskZ_asyncioÚImportErrorZ_CTaskr   r   r   r   rg   r   rc   r   r   r‡   ÚglobalsrS   r   rˆ   rŠ   r
   r   r   r   r   r   r   Ú<module>   sX   
 s
--8

W5