B
    v9aw                 @   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   /usr/lib/python3.7/tasks.pyr      s    r   c                sb    d krt   d}x:ytt}W n& tk
rH   |d7 }|dkrD Y qX P qW  fdd|D S )Nr   r   i  c                s&   h | ]}t | kr| s|qS r   )r   	_get_loopdone).0t)r   r   r    	<setcomp>5   s    zall_tasks.<locals>.<setcomp>)r   r   list
_all_tasksRuntimeError)r   itasksr   )r   r    r   "   s    r   c                sb    d krt   d}x:ytt}W n& tk
rH   |d7 }|dkrD Y qX P qW  fdd|D S )Nr   r   i  c                s   h | ]}t | kr|qS r   )r   r!   )r#   r$   )r   r   r    r%   N   s    z$_all_tasks_compat.<locals>.<setcomp>)r   get_event_loopr&   r'   r(   )r   r)   r*   r   )r   r    _all_tasks_compat9   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   c   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/   r0   r1   r,   )r2   r   r   r   r    r   s   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    r6      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_PENDINGr9   r7   r@   Zcall_exception_handlerr5   __del__)rC   r4   )rE   r   r    rH      s    
zTask.__del__c             C   s
   t | S )N)r   Z_task_repr_info)rC   r   r   r    
_repr_info   s    zTask._repr_infoc             C   s   t dd S )Nz*Task does not support set_result operation)r(   )rC   resultr   r   r    
set_result   s    zTask.set_resultc             C   s   t dd S )Nz-Task does not support set_exception operation)r(   )rC   	exceptionr   r   r    set_exception   s    zTask.set_exception)limitc            C   s   t | |S )N)r   Z_task_get_stack)rC   rN   r   r   r    	get_stack   s    zTask.get_stack)rN   filec            C   s   t | ||S )N)r   Z_task_print_stack)rC   rN   rP   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"   r<   cancelr;   )rC   r   r   r    rR      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)r4   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InvalidStateErrorr;   
isinstanceCancelledErrorr=   r<   r   r@   sendthrowStopIterationr5   rM   rK   valuerR   	ExceptionBaseExceptiongetattrr!   r(   rA   rB   r?   rS   add_done_callback_Task__wakeupinspectZisgeneratorr   )rC   excrD   rJ   Zblockingnew_exc)rE   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)rJ   rZ   rB   )rC   futurer`   r   r   r    Z__wakeup<  s    zTask.__wakeup)N)N)N)__name__
__module____qualname__r9   classmethodr   r   r6   rH   rI   rK   rM   rO   rQ   rR   rB   r^   __classcell__r   r   )rE   r    r   Q   s   !Tr   c             C   s   t  }|| S )N)r   r   r   )rD   r   r   r   r    r   Y  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%     s    zwait.<locals>.<setcomp>)r   isfuturer   r8   r:   typerc   
ValueErrorr   r   r   r   r+   set_wait)fsr   rh   ri   r   )r   r    r   i  s    r   c             G   s   |   s| d  d S )N)r"   rK   )waiterargsr   r   r    _release_waiter  s    rs   )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"   rJ   rR   r   TimeoutErrorcreate_future
call_laterrs   	functoolspartialr]   rU   remove_done_callback_cancel_and_wait)futrh   r   rq   timeout_handlecbr   r   r    r     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| D ]}|| qzW X t t  }}x*| 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   	cancelledrL   rR   r"   rK   )rj   )counterri   r|   rq   r   r    _on_completion  s    z_wait.<locals>._on_completion)
ru   rv   rs   lenr]   rR   ry   rn   r"   add)rp   rh   ri   r   r   rj   r"   Zpendingr   )r   ri   r|   rq   r    ro     s(    


ro   c          	      sF   |  }tt|}| | z|   |I d H  W d | | X d S )N)ru   rw   rx   rs   r]   rR   ry   )r{   r   rq   r}   r   r   r    rz     s    
rz   )r   rh   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#   rj   )r   r   r    r%     s    zas_completed.<locals>.<setcomp>r   )Queue)r   c                 s.   x D ]} |    d  qW   d S )N)ry   
put_nowaitclear)rj   )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   rR   )rj   )r"   r|   r   r   r    r   #  s    

z$as_completed.<locals>._on_completionc                 s$      I d H } | d krtj|  S )N)r   r   rt   rJ   )rj   )r"   r   r    _wait_for_one+  s    z#as_completed.<locals>._wait_for_one)r   rk   r   r8   r:   rl   rc   r   r+   rn   Zqueuesr   r]   rv   ranger   )rp   r   rh   r   r   r   rj   _r   )r   r"   r   r|   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+   ru   rv   r   Z_set_result_unless_cancelledrR   )ZdelayrJ   r   rb   hr   r   r    r	   F  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 )Nr3   z$loop argument must agree with Future)r   z:An asyncio.Future, a coroutine or an awaitable is required)r   r8   r   r+   r   r7   r   rk   r!   rm   r_   Zisawaitabler   _wrap_awaitabler:   )Zcoro_or_futurer   rF   r   r   r    r   X  s    



r   c             c   s   |   E d H S )N)	__await__)Z	awaitabler   r   r    r   o  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)r5   r6   	_children_cancel_requested)rC   childrenr   )rE   r   r    r6     s    z_GatheringFuture.__init__c             C   s:   |   rdS d}x| jD ]}| rd}qW |r6d| _|S )NFT)r"   r   rR   r   )rC   retZchildr   r   r    rR     s    z_GatheringFuture.cancel)rc   rd   re   r6   rR   rg   r   r   )rE   r    r   y  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~   rL   r   rU   rM   rJ   appendr   rK   )r{   r`   resultsZres)r   	nfinishednfutsouterr   r   r    _done_callback  s4    



zgather.<locals>._done_callbackr   )r   Fr   )r   r+   ru   rK   r   r   r!   r9   r]   r   r   )r   r   Zcoros_or_futuresr   Z
arg_to_futargr{   r   )r   r   r   r   r   r    r
     s2    
1

r
   c               s\   t | |d rS t}| fdd  fdd}  | S )N)r   c                s\      r|   s|   d S |   r.   n*|  }|d k	rJ | n |   d S )N)r~   rL   rR   rM   rK   rJ   )innerr`   )r   r   r    _inner_done_callback#  s    
z$shield.<locals>._inner_done_callbackc                s     s  d S )N)r"   ry   )r   )r   r   r   r    _outer_done_callback4  s    z$shield.<locals>._outer_done_callback)r   r"   r   r!   ru   r]   )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   rZ   Zset_running_or_notify_cancelrM   )r`   )rD   rb   r   r   r    callbackF  s    
z*run_coroutine_threadsafe.<locals>.callback)r   r8   r:   
concurrentr   FutureZcall_soon_threadsafe)rD   r   r   r   )rD   rb   r   r    r   =  s    


r   c             C   s   t |  d S )N)r'   r   )rF   r   r   r    r   Z  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   r(   )r   rF   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   r(   )r   rF   r   r   r   r    r   g  s    
r   c             C   s   t |  d S )N)r'   discard)rF   r   r   r    r   o  s    r   )r   r   r   r   r'   r   )N)N)N)N):__all__concurrent.futuresr   r>   rw   r_   typesr/   weakref r   r   r   r   r   r   r   r,   Z	_PyFuturer   Z_PyTaskZ_asyncioImportErrorZ_CTaskr   r   r   r   r   rs   r   ro   rz   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;$