a
    zes                     @   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	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 dd
lmZ edjZdDddZdEddZdFddZdd ZG dd dejZeZzddlZW n ey    Y n0 ej ZZdd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*dGddd)d*Z+ddd+d,Z,ej)d-d. Z-ee-_G d/d0 d0ej.Z/dd1d2d3d4Z0dd1d2d5d6Z1ddd7d8Z2d9d: Z3e	4 Z5i Z6d;d< Z7d=d> Z8d?d@ Z9dAdB Z:e7Z;e:Z<e8Z=e9Z>z$ddClm7Z7m:Z:m8Z8m9Z9m5Z5m6Z6 W n eyv   Y n0 e7Z?e:Z@e8ZAe9ZBdS )H)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)GenericAlias   )
base_tasks)
coroutines)events)
exceptions)futures)_is_coroutinec                 C   s   | d u rt  } t| S N)r   get_running_loop_current_tasksgetloop r#   #/usr/lib/python3.9/asyncio/tasks.pyr   #   s    r   c                    s\    d u rt   d}ztt}W qJ tyD   |d7 }|dkr@ Y q0 qJq fdd|D S )Nr   r     c                    s&   h | ]}t | u r| s|qS r#   )r   	_get_loopdone.0tr!   r#   r$   	<setcomp>=   s   zall_tasks.<locals>.<setcomp>)r   r   list
_all_tasksRuntimeErrorr"   iZtasksr#   r!   r$   r   *   s    r   c                    s\    d u rt   d}ztt}W qJ tyD   |d7 }|dkr@ Y q0 qJq fdd|D S )Nr   r   r%   c                    s   h | ]}t | u r|qS r#   )r   r&   r(   r!   r#   r$   r+   V       z$_all_tasks_compat.<locals>.<setcomp>)r   get_event_loopr,   r-   r.   r/   r#   r!   r$   _all_tasks_compatA   s    r3   c                 C   s2   |d ur.z
| j }W n ty$   Y n
0 || d S r   )set_nameAttributeError)tasknamer4   r#   r#   r$   _set_task_nameY   s    
r8   c                       s   e Zd ZdZddd fdd
Z fddZeeZdd	 Z	d
d Z
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dZd! fdd	Zdd Z  ZS )"r   TN)r"   r7   c                   s   t  j|d | jr| jd= t|s:d| _td||d u rRdt  | _n
t	|| _d| _
d | _|| _t | _| jj| j| jd t|  d S )Nr!   Fza coroutine was expected, got zTask-context)super__init___source_tracebackr   iscoroutine_log_destroy_pending	TypeError_task_name_counter_namestr_must_cancel_fut_waiter_corocontextvarsZcopy_context_context_loop	call_soon_Task__stepr   )selfcoror"   r7   	__class__r#   r$   r=   u   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!)r6   messageZsource_traceback)	_stater   Z_PENDINGr@   r>   rJ   Zcall_exception_handlerr<   __del__)rM   r;   rO   r#   r$   rS      s    
zTask.__del__c                 C   s
   t | S r   )r   Z_task_repr_inforM   r#   r#   r$   
_repr_info   s    zTask._repr_infoc                 C   s   | j S r   )rG   rT   r#   r#   r$   get_coro   s    zTask.get_coroc                 C   s   | j S r   )rC   rT   r#   r#   r$   get_name   s    zTask.get_namec                 C   s   t || _d S r   )rD   rC   )rM   valuer#   r#   r$   r4      s    zTask.set_namec                 C   s   t dd S )Nz*Task does not support set_result operationr.   )rM   resultr#   r#   r$   
set_result   s    zTask.set_resultc                 C   s   t dd S )Nz-Task does not support set_exception operationrY   )rM   	exceptionr#   r#   r$   set_exception   s    zTask.set_exception)limitc                C   s   t | |S r   )r   Z_task_get_stack)rM   r^   r#   r#   r$   	get_stack   s    zTask.get_stack)r^   filec                C   s   t | ||S r   )r   Z_task_print_stack)rM   r^   r`   r#   r#   r$   print_stack   s    	zTask.print_stackc                 C   s>   d| _ |  rdS | jd ur.| jj|dr.dS d| _|| _dS NFmsgT)Z_log_tracebackr'   rF   cancelrE   _cancel_message)rM   rd   r#   r#   r$   re      s    
zTask.cancelc              
      s  |   rtd| d|| jr>t|tjs8|  }d| _| j}d | _t	| j
|  zz"|d u rp|d }n
||}W n ty } z:| jrd| _t j| jd nt |j W Y d }~n d }~0  tjy } z|| _t   W Y d }~nd }~0  ttfy> } zt |  W Y d }~nd }~0  typ } zt | W Y d }~n~d }~0 0 t|dd }|d urjt|| j
urtd| d|d}| j
j| j|| jd	 n|r>|| u rtd
| }| j
j| j|| jd	 n>d|_|j | j!| jd	 || _| jrh| jj| jdrhd| _n*td| d|}| j
j| j|| jd	 n||d u r| j
j| j| jd	 n\t"#|rtd| d|}| j
j| j|| jd	 n$td|}| j
j| j|| jd	 W t$| j
|  d } nt$| j
|  d } 0 d S )Nz_step(): already done: z, Frc   _asyncio_future_blockingzTask z got Future z attached to a different loopr:   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   InvalidStateErrorrE   
isinstanceCancelledError_make_cancelled_errorrG   rF   r   rJ   sendthrowStopIterationr<   re   rf   r[   rX   Z_cancelled_excKeyboardInterrupt
SystemExitr]   BaseExceptiongetattrr   r&   r.   rK   rL   rI   rg   add_done_callback_Task__wakeupinspectZisgeneratorr   )rM   excrN   rZ   blockingnew_excrO   r#   r$   Z__step   s    $ $







zTask.__stepc              
   C   sL   z|   W n. ty: } z| | W Y d }~nd }~0 0 |   d } d S r   )rZ   rq   rL   )rM   futurerv   r#   r#   r$   Z__wakeupF  s     zTask.__wakeup)N)N)__name__
__module____qualname__r@   r=   rS   classmethodr   __class_getitem__rU   rV   rW   r4   r[   r]   r_   ra   re   rL   rt   __classcell__r#   r#   rO   r$   r   c   s   
"Wr   )r7   c                C   s    t  }|| }t|| |S r   )r   r   r   r8   )rN   r7   r"   r6   r#   r#   r$   r   c  s    

r   )r"   timeoutreturn_whenc                   s   t | st| r(tdt| j | s4td|tt	t
fvrPtd|  d u rbt  ntjdtdd t| } tdd | D rtjd	tdd  fd
d| 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: [The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.   
stacklevelc                 s   s   | ]}t |V  qd S r   )r   r?   r)   fr#   r#   r$   	<genexpr>  r1   zwait.<locals>.<genexpr>zThe explicit passing of coroutine objects to asyncio.wait() is deprecated since Python 3.8, and scheduled for removal in Python 3.11.c                    s   h | ]}t | d qS r!   r   r   r!   r#   r$   r+     r1   zwait.<locals>.<setcomp>)r   isfuturer   r?   rA   typerz   
ValueErrorr   r   r   r   r   warningswarnDeprecationWarningsetany_wait)fsr"   r   r   r#   r!   r$   r   u  s$    
r   c                 G   s   |   s| d  d S r   )r'   r[   )waiterargsr#   r#   r$   _release_waiter  s    r   r!   c             
      s  |d u rt  }ntjdtdd |d u r4| I d H S |dkrt| |d} |  rX|  S t| |dI d H  z
|  W S  t	j
y } zt	 |W Y d }~n
d }~0 0 | }||t|}tt|}t| |d} | | zz|I d H  W nT t	j
yB   |  r |   Y W |  S | | t| |dI d H   Y n0 |  r`|  W |  S | | t| |dI d H  z|  W W |  S  t	j
y } zt	 |W Y d }~n
d }~0 0 W |  n
|  0 d S )Nr   r   r   r   r!   )r   r   r   r   r   r   r'   rZ   _cancel_and_waitr   rj   TimeoutErrorcreate_future
call_laterr   	functoolspartialrs   re   remove_done_callback)futr   r"   rv   r   timeout_handlecbr#   r#   r$   r     sZ    


 





"r   c              
      s   |  d |d ur"||tt|   fdd}| D ]}|| q@z2I d H  W d urn  | D ]}|| qrn&d ur  | D ]}|| q0 t t  }}| D ]"}| r|	| q|	| q||fS )Nc                    sZ    d8   dks4t ks4tkrV|  sV|  d urVd urD   sVd  d S )Nr   r   )r   r   	cancelledr\   re   r'   r[   r   Zcounterr   r   r   r#   r$   _on_completion  s    
z_wait.<locals>._on_completion)
r   r   r   lenrs   re   r   r   r'   add)r   r   r   r"   r   r   r'   pendingr#   r   r$   r     s0    r   c              	      sP   |  }tt|}| | z |   |I d H  W | | n| | 0 d S r   )r   r   r   r   rs   re   r   )r   r"   r   r   r#   r#   r$   r     s    
r   )r"   r   c                #   s   t | st| r(tdt| j d ur@tjdt	dd ddl
m} |dd u rft fdd	t| D d  fd
d}fdd fdd}D ]}|  qr|d ur؈||ttD ]}| V  qd S )Nz#expect an iterable of futures, not r   r   r   r   )Queuer!   c                    s   h | ]}t | d qS r   r   r   r!   r#   r$   r+   M  r1   zas_completed.<locals>.<setcomp>c                     s*   D ]} |    d  q  d S r   )r   
put_nowaitclearr   )r   r'   todor#   r$   _on_timeoutP  s    
z!as_completed.<locals>._on_timeoutc                    s4   sd S  |   |  s0d ur0  d S r   )remover   re   r   )r'   r   r   r#   r$   r   V  s    

z$as_completed.<locals>._on_completionc                     s$      I d H } | d u rtj|  S r   )r    r   r   rZ   r   )r'   r#   r$   _wait_for_one^  s    z#as_completed.<locals>._wait_for_one)r   r   r   r?   rA   r   rz   r   r   r   queuesr   r   r2   r   rs   r   ranger   )r   r"   r   r   r   r   r   _r#   )r   r'   r"   r   r   r$   r   .  s*    
r   c                   c   s
   d V  d S r   r#   r#   r#   r#   r$   __sleep0m  s    	r   c                   s~   |d urt jdtdd | dkr0t I d H  |S |d u r@t }| }|| tj	||}z|I d H W |
  S |
  0 d S )Nr   r   r   r   )r   r   r   r   r   r   r   r   r   Z_set_result_unless_cancelledre   )delayrZ   r"   ry   hr#   r#   r$   r	   y  s&    
r	   c                C   s   t | r6|d u rt }|| }|jr2|jd= |S t| rb|d ur^|t| ur^t	d| S t
| r|tt| |dS tdd S )Nr9   zRThe future belongs to a different loop than the one specified as the loop argumentr!   z:An asyncio.Future, a coroutine or an awaitable is required)r   r?   r   r2   r   r>   r   r   r&   r   ru   Zisawaitabler   _wrap_awaitablerA   )Zcoro_or_futurer"   r6   r#   r#   r$   r     s    



r   c                 c   s   |   E d H S r   )	__await__)Z	awaitabler#   r#   r$   r     s    r   c                       s,   e Zd Zdd fdd
ZdddZ  ZS )_GatheringFutureNr!   c                   s   t  j|d || _d| _d S )Nr!   F)r<   r=   	_children_cancel_requested)rM   childrenr"   rO   r#   r$   r=     s    z_GatheringFuture.__init__c                 C   s:   |   rdS d}| jD ]}|j|drd}q|r6d| _|S rb   )r'   r   re   r   )rM   rd   retchildr#   r#   r$   re     s    
z_GatheringFuture.cancel)N)rz   r{   r|   r=   re   r   r#   r#   rO   r$   r     s   r   Fr"   return_exceptionsc                 G   s(   | d urt jdtdd t|| |dS )Nr   r   r   r   )r   r   r   _gather)r"   r   coros_or_futuresr#   r#   r$   r
     s
    r
   c                    s   |s*| d u rt  } |  g  S  fdd}i }g  ddd |D ]f}||vrt|| d}| d u rt|} ||urd|_d7 |||< || n|| } 	| qVt
 | dS )Nc                    s   d7 d u s  r,|  s(|   d S sl|  rN|  }| d S |  }|d url| d S krg } D ]J} |  rt| jd u rdn| j}n|  }|d u r|  }|	| q|j
r|  }| n
| d S )Nr    )r'   r   r\   rk   r]   r   rj   rf   rZ   appendr   r[   )r   rv   resultsresr   Z	nfinishedZnfutsouterr   r#   r$   _done_callback  s<    

z_gather.<locals>._done_callbackr   r!   Fr   )r   r2   r   r[   r   r   r&   r@   rs   r   r   )r"   r   r   r   Z
arg_to_futargr   r#   r   r$   r     s4    
7
r   c                   st   |d urt jdtdd t| |d r0S t}| fdd  fdd}  | S )	Nr   r   r   r!   c                    s\      r|   s|   d S |   r.   n*|  }|d urJ | n |   d S r   )r   r\   re   r]   r[   rZ   )innerrv   r   r#   r$   _inner_done_callbackz  s    
z$shield.<locals>._inner_done_callbackc                    s     s  d S r   )r'   r   r   )r   r   r#   r$   _outer_done_callback  s    z$shield.<locals>._outer_done_callback)	r   r   r   r   r'   r   r&   r   rs   )r   r"   r   r#   )r   r   r   r$   r   U  s    


r   c                    s:   t  stdtj  fdd}| S )NzA coroutine object is requiredc               
      sl   zt t d W nN ttfy0    Y n8 tyf }  z  rP|   W Y d } ~ n
d } ~ 0 0 d S )Nr!   )r   Z_chain_futurer   rp   ro   rq   set_running_or_notify_cancelr]   )rv   rN   ry   r"   r#   r$   callback  s    
z*run_coroutine_threadsafe.<locals>.callback)r   r?   rA   
concurrentr   FutureZcall_soon_threadsafe)rN   r"   r   r#   r   r$   r     s    



r   c                 C   s   t |  d S r   )r-   r   r6   r#   r#   r$   r     s    r   c                 C   s4   t | }|d u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"   r6   r   r#   r#   r$   r     s    


r   c                 C   s2   t | }||ur(td|d|dt | = d S )NzLeaving task z! does not match the current task .r   r   r#   r#   r$   r     s    


r   c                 C   s   t |  d S r   )r-   discardr   r#   r#   r$   r     s    r   )r   r   r   r   r-   r   )N)N)N)N)C__all__concurrent.futuresr   rH   r   ru   	itertoolstypesr   weakrefr   r   r   r   r   r   r   r   count__next__rB   r   r   r3   r8   Z	_PyFuturer   Z_PyTaskZ_asyncioImportErrorZ_CTaskr   r   r   r   r   r   r   r   r   r   	coroutiner   r	   r   r   r   r   r
   r   r   r   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>   s   	



 u
+L,?

&^?$