B
    0*\v                 @   s<  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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	d
Zd>ddZd?dd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dd ZejjZejjZejjZddedddZdd ZddddZdd Zdd Z dddd d!Z!ejd"d# Z"d@ddd$d%Z#ddd&d'Z$ed(d) Z%G d*d+ d+ej&Z'dd,d-d.d/Z(ddd0d1Z)d2d3 Z*e+ Z,i Z-d4d5 Z.d6d7 Z/d8d9 Z0d:d; Z1e.Z2e1Z3e/Z4e0Z5y$dd<lm.Z.m1Z1m/Z/m0Z0m,Z,m-Z- W n ek
r&   Y nX e.Z6e1Z7e/Z8e0Z9dS )A)Taskcreate_taskFIRST_COMPLETEDFIRST_EXCEPTIONALL_COMPLETEDwaitwait_foras_completedsleepgathershieldensure_futurerun_coroutine_threadsafecurrent_task	all_tasks_register_task_unregister_task_enter_task_leave_task    N   )
base_tasks)
coroutines)events)futures)	coroutinec             C   s   | d krt  } t| S )N)r   get_running_loop_current_tasksget)loop r   8C:\ALexclude\prg\programme\Python37\Lib\asyncio\tasks.pyr      s    r   c                s&    d krt    fddttD S )Nc                s&   h | ]}t | kr| s|qS r   )r   	_get_loopdone).0t)r   r   r    	<setcomp>(   s    zall_tasks.<locals>.<setcomp>)r   r   list
_all_tasks)r   r   )r   r    r   "   s    r   c                s&    d krt    fddttD S )Nc                s   h | ]}t | kr|qS r   )r   r!   )r#   r$   )r   r   r    r%   4   s    z$_all_tasks_compat.<locals>.<setcomp>)r   get_event_loopr&   r'   )r   r   )r   r    _all_tasks_compat,   s    r)   c                   s   e Zd ZdZedddZedddZdd fdd	
Z fd
dZdd Z	d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(   t jdtdd |d kr t }t|S )NzETask.current_task() is deprecated, use asyncio.current_task() instead   )
stacklevel)warningswarnPendingDeprecationWarningr   r(   r   )clsr   r   r   r    r   I   s    zTask.current_taskc             C   s   t jdtdd t|S )Nz?Task.all_tasks() is deprecated, use asyncio.all_tasks() insteadr*   )r+   )r,   r-   r.   r)   )r/   r   r   r   r    r   Y   s    zTask.all_tasks)r   c               sv   t  j|d | jr| jd= t|s:d| _td|d| _d | _|| _	t
 | _| jj| j| jd t|  d S )N)r   Fza coroutine was expected, got )context)super__init___source_tracebackr   iscoroutine_log_destroy_pending	TypeError_must_cancel_fut_waiter_corocontextvarsZcopy_context_context_loop	call_soon_Task__stepr   )selfcoror   )	__class__r   r    r3   e   s    

zTask.__init__c                sF   | j tjkr8| jr8| dd}| jr,| j|d< | j| t   d S )Nz%Task was destroyed but it is pending!)taskmessageZsource_traceback)	Z_stater   Z_PENDINGr6   r4   r=   Zcall_exception_handlerr2   __del__)r@   r1   )rB   r   r    rE   w   s    
zTask.__del__c             C   s
   t | S )N)r   Z_task_repr_info)r@   r   r   r    
_repr_info   s    zTask._repr_infoc             C   s   t dd S )Nz*Task does not support set_result operation)RuntimeError)r@   resultr   r   r    
set_result   s    zTask.set_resultc             C   s   t dd S )Nz-Task does not support set_exception operation)rG   )r@   	exceptionr   r   r    set_exception   s    zTask.set_exception)limitc            C   s   t | |S )N)r   Z_task_get_stack)r@   rL   r   r   r    	get_stack   s    zTask.get_stack)rL   filec            C   s   t | ||S )N)r   Z_task_print_stack)r@   rL   rN   r   r   r    print_stack   s    	zTask.print_stackc             C   s4   d| _ |  rdS | jd k	r*| j r*dS d| _dS )NFT)Z_log_tracebackr"   r9   cancelr8   )r@   r   r   r    rP      s    

zTask.cancelc          
      s  |   rtd| d|| jr>t|tjs8t }d| _| j}d | _t| j	|  zhy"|d krp|
d }n
||}W n tk
r } z0| jrd| _t t  nt |j W d d }~X Y n tjk
r   t   Y n tk
r } zt | W d d }~X Y n tk
rN } zt |  W d d }~X Y npX t|dd }|d k	rBt|| j	k	rtd| d|d}| j	j| j|| jd n|r|| krtd	| }| j	j| j|| jd n8d|_|j| j| jd || _| jr@| j r@d| _n*td
| d|}| j	j| j|| jd n||d krb| j	j| j| jd n\t|rtd| d|}| j	j| j|| jd n$td|}| j	j| j|| jd W d t| j	|  d } X d S )Nz_step(): already done: z, F_asyncio_future_blockingzTask z got Future z attached to a different loop)r1   zTask cannot await on itself: z-yield was used instead of yield from in task z with z;yield was used instead of yield from for generator in task zTask got bad yield: ) r"   r   ZInvalidStateErrorr8   
isinstanceCancelledErrorr:   r9   r   r=   sendthrowStopIterationr2   rK   rI   valuerP   	ExceptionBaseExceptiongetattrr!   rG   r>   r?   r<   rQ   add_done_callback_Task__wakeupinspectZisgeneratorr   )r@   excrA   rH   Zblockingnew_exc)rB   r   r    Z__step   s|     


zTask.__stepc          
   C   sJ   y|   W n, tk
r8 } z| | W d d }~X Y n
X |   d } d S )N)rH   rX   r?   )r@   futurer^   r   r   r    Z__wakeup"  s    zTask.__wakeup)N)N)N)__name__
__module____qualname__r6   classmethodr   r   r3   rE   rF   rI   rK   rM   rO   rP   r?   r\   __classcell__r   r   )rB   r    r   7   s   !Tr   c             C   s   t  }|| S )N)r   r   r   )rA   r   r   r   r    r   ?  s    r   )r   timeoutreturn_whenc               s   t | st| r(tdt| j | s4td|tt	t
fkrPtd|  d kr`t   fddt| D } t| || I d H S )Nzexpect a list of futures, not z#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%   i  s    zwait.<locals>.<setcomp>)r   isfuturer   r5   r7   typera   
ValueErrorr   r   r   r   r(   set_wait)fsr   rf   rg   r   )r   r    r   O  s    r   c             G   s   |   s| d  d S )N)r"   rI   )waiterargsr   r   r    _release_waitern  s    rq   )r   c               s  |d krt  }|d kr"| I d H S |dkrVt| |d} |  rF|  S |   t | }|	|t
|}tt
|}t| |d} | | zry|I d H  W n* tjk
r   | | |    Y nX |  r|  S | | t| |dI d H  t W d |  X d S )Nr   )r   )r   r(   r   r"   rH   rP   r   TimeoutErrorcreate_future
call_laterrq   	functoolspartialr[   rS   remove_done_callback_cancel_and_wait)futrf   r   ro   timeout_handlecbr   r   r    r   s  s8    



r   c                s   |  d |d k	r"||tt|   fdd}x| D ]}|| qBW zI d H  W d d k	rt  X t t  }}x4| D ],}|| | r|	| q|	| qW ||fS )Nc                sZ    d8   dks4t ks4tkrV|  sV|  d k	rVd k	rD   sVd  d S )Nr   r   )r   r   	cancelledrJ   rP   r"   rI   )rh   )counterrg   rz   ro   r   r    _on_completion  s    z_wait.<locals>._on_completion)
rs   rt   rq   lenr[   rP   rl   rw   r"   add)rn   rf   rg   r   r~   rh   r"   Zpendingr   )r}   rg   rz   ro   r    rm     s&    



rm   c          	      sF   |  }tt|}| | z|   |I d H  W d | | X d S )N)rs   ru   rv   rq   r[   rP   rw   )ry   r   ro   r{   r   r   r    rx     s    
rx   )r   rf   c            #   s   t | st| r(tdt| j d k	r4nt fddt	| D ddl
m} |dd  fdd}fd	d
 fdd}xD ]}|  qW r|d k	rȈ||xttD ]}| V  qW d S )Nzexpect a list of futures, not c                s   h | ]}t | d qS ))r   )r   )r#   rh   )r   r   r    r%     s    zas_completed.<locals>.<setcomp>r   )Queue)r   c                 s.   x D ]} |    d  qW   d S )N)rw   
put_nowaitclear)rh   )r~   r"   todor   r    _on_timeout  s    

z!as_completed.<locals>._on_timeoutc                s4   sd S  |   |  s0d k	r0  d S )N)remover   rP   )rh   )r"   rz   r   r   r    r~     s    

z$as_completed.<locals>._on_completionc                 s$      I d H } | d krtj|  S )N)r   r   rr   rH   )rh   )r"   r   r    _wait_for_one  s    z#as_completed.<locals>._wait_for_one)r   ri   r   r5   r7   rj   ra   r   r(   rl   Zqueuesr   r[   rt   ranger   )rn   r   rf   r   r   r   rh   _r   )r~   r"   r   rz   r   r    r     s     

r   c               c   s
   d V  d S )Nr   r   r   r   r    __sleep0  s    	r   c               s\   | dkrt  I d H  |S |d kr(t }| }|| tj||}z
|I d H S |  X d S )Nr   )r   r   r(   rs   rt   r   Z_set_result_unless_cancelledrP   )ZdelayrH   r   r`   hr   r   r    r	   +  s    
r	   c            C   s   t | r6|d krt }|| }|jr2|jd= |S t| rb|d k	r^|t| k	r^t	d| S t
| r|tt| |dS tdd S )Nr0   z$loop argument must agree with Future)r   z:An asyncio.Future, a coroutine or an awaitable is required)r   r5   r   r(   r   r4   r   ri   r!   rk   r]   Zisawaitabler   _wrap_awaitabler7   )Zcoro_or_futurer   rC   r   r   r    r   =  s    



r   c             c   s   |   E d H S )N)	__await__)Z	awaitabler   r   r    r   T  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)r2   r3   	_children_cancel_requested)r@   childrenr   )rB   r   r    r3   f  s    z_GatheringFuture.__init__c             C   s:   |   rdS d}x| jD ]}| rd}qW |r6d| _|S )NFT)r"   r   rP   r   )r@   retZchildr   r   r    rP   k  s    z_GatheringFuture.cancel)ra   rb   rc   r3   rP   re   r   r   )rB   r    r   ^  s   r   F)r   return_exceptionsc                s   |s*| d krt  } |  g  S  fdd}i }g  ddxn|D ]f}||krt|| d}| d kr~t|} ||k	rd|_d7 |||< || n|| } 	| qTW t
 | dS )Nc                s   d7   r$|  s |   d S sd|  rFt }| d S |  }|d k	rd| d S krg }x@ D ]8} |  rt }n|  }|d kr|  }|| qvW jrȈt  n
	| d S )Nr   )
r"   r|   rJ   r   rS   rK   rH   appendr   rI   )ry   r^   resultsres)r   	nfinishednfutsouterr   r   r    _done_callback  s4    



zgather.<locals>._done_callbackr   )r   Fr   )r   r(   rs   rI   r   r   r!   r6   r[   r   r   )r   r   Zcoros_or_futuresr   Z
arg_to_futargry   r   )r   r   r   r   r   r    r
   z  s2    
1

r
   c               sD   t | |d}| r|S t|}|   fdd}||  S )N)r   c                s\      r|   s|   d S |   r.   n*|  }|d k	rJ | n |   d S )N)r|   rJ   rP   rK   rI   rH   )innerr^   )r   r   r    r     s    
zshield.<locals>._done_callback)r   r"   r   r!   rs   r[   )r   r   r   r   r   )r   r    r     s    

r   c                s:   t  stdtj  fdd}| S )NzA coroutine object is requiredc           
      sT   yt t d W n6 tk
rN }  z r<|   W d d } ~ X Y nX d S )N)r   )r   Z_chain_futurer   rX   Zset_running_or_notify_cancelrK   )r^   )rA   r`   r   r   r    callback%  s    
z*run_coroutine_threadsafe.<locals>.callback)r   r5   r7   
concurrentr   FutureZcall_soon_threadsafe)rA   r   r   r   )rA   r`   r   r    r     s    


r   c             C   s   t |  d S )N)r'   r   )rC   r   r   r    r   9  s    r   c             C   s4   t | }|d k	r(td|d|d|t | < d S )NzCannot enter into task z while another task z is being executed.)r   r   rG   )r   rC   r   r   r   r    r   >  s    
r   c             C   s2   t | }||k	r(td|d|dt | = d S )NzLeaving task z! does not match the current task .)r   r   rG   )r   rC   r   r   r   r    r   F  s    
r   c             C   s   t |  d S )N)r'   discard)rC   r   r   r    r   N  s    r   )r   r   r   r   r'   r   )N)N)N)N):__all__concurrent.futuresr   r;   ru   r]   typesr,   weakref r   r   r   r   r   r   r   r)   Z	_PyFuturer   Z_PyTaskZ_asyncioImportErrorZ_CTaskr   r   r   r   r   rq   r   rm   rx   r   r   r	   r   r   r   r   r
   r   r   ZWeakSetr'   r   r   r   r   r   Z_py_register_taskZ_py_unregister_taskZ_py_enter_taskZ_py_leave_taskZ_c_register_taskZ_c_unregister_taskZ_c_enter_taskZ_c_leave_taskr   r   r   r    <module>   sv   



 }
9+7
m5$