o
     JAf~                     @   sj  	 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dBddZdBd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w ej ZZddddZejjZejj Z ejj!Z!de!dddZ"dd Z#dd Z$dd Z%dd  Z&dd!d"d#Z'ej(d$d% Z)dBd&d'Z*dd(d)d*Z+dd(d+d,Z,ej(d-d. Z-ee-_G d/d0 d0ej.Z/d1d2d3d4Z0d5d6 Z1d7d8 Z2e	3 Z4i Z5d9d: Z6d;d< Z7d=d> Z8d?d@ Z9e6Z:e9Z;e7Z<e8Z=zddAlm6Z6m9Z9m7Z7m8Z8m4Z4m5Z5 W n ey*   Y dS w e6Z>e9Z?e7Z@e8ZAdS )C)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.10/asyncio/tasks.pyr   #   s   
r   c                    s`   	  d u r	t   d}	 ztt}W n ty$   |d7 }|dkr" Y nw nq fdd|D S )Nr   Tr   i  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                 C   s8   |d urz| j }W n
 ty   Y d S w || d S d S r   )set_nameAttributeError)tasknamer.   r#   r#   r$   _set_task_nameA   s   
r2   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"   r1   c                   s   t  j|d | jr| jd= t|sd| _td||d u r)d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"   r1   	__class__r#   r$   r7   ]   s   


zTask.__init__c                    sF   | j tjkr| jr| dd}| jr| j|d< | j| t   d S )Nz%Task was destroyed but it is pending!)r0   messageZsource_traceback)	_stater   Z_PENDINGr:   r8   rD   Zcall_exception_handlerr6   __del__)rG   r5   rI   r#   r$   rM   t   s   
zTask.__del__c                 C   s
   t | S r   )r   Z_task_repr_inforG   r#   r#   r$   
_repr_info   s   
zTask._repr_infoc                 C      | j S r   )rA   rN   r#   r#   r$   get_coro      zTask.get_coroc                 C   rP   r   )r=   rN   r#   r#   r$   get_name   rR   zTask.get_namec                 C   s   t || _d S r   )r>   r=   )rG   valuer#   r#   r$   r.      s   zTask.set_namec                 C      t d)Nz*Task does not support set_result operationr,   )rG   resultr#   r#   r$   
set_result      zTask.set_resultc                 C   rU   )Nz-Task does not support set_exception operationrV   )rG   	exceptionr#   r#   r$   set_exception   rY   zTask.set_exception)limitc                C   s   	 t | |S r   )r   Z_task_get_stack)rG   r\   r#   r#   r$   	get_stack   s   zTask.get_stack)r\   filec                C   s   	 t | ||S r   )r   Z_task_print_stack)rG   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&   r@   cancelr?   _cancel_message)rG   rb   r#   r#   r$   rc      s   
zTask.cancelc              
      s  |   rtd| d|| jrt|tjs|  }d| _| j}d | _t	| j
|  zz|d u r8|d }n||}W nn tyg } z| jrUd| _t j| jd nt |j W Y d }~nd }~w tjy } z|| _t   W Y d }~nd }~w ttfy } zt |  d }~w ty } zt | W Y d }~nd }~ww t|dd }|d ur't|| j
urtd| d|d}| j
j| j|| jd	 n|r|| u rtd
| }| j
j| j|| jd	 nd|_|j | j!| jd	 || _| jr| jj| jdrd| _ntd| d|}| j
j| j|| jd	 nj|d u r7| j
j| j| jd	 nt"#|rStd| d|}| j
j| j|| jd	 nutd|}| j
j| j|| jd	 W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S W t$| j
|  d } d S t$| j
|  d } w )Nz_step(): already done: z, Fra   _asyncio_future_blockingzTask z got Future z attached to a different loopr4   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   InvalidStateErrorr?   
isinstanceCancelledError_make_cancelled_errorrA   r@   r   rD   sendthrowStopIterationr6   rc   rd   rX   rT   Z_cancelled_excKeyboardInterrupt
SystemExitr[   BaseExceptiongetattrr   r%   r,   rE   rF   rC   re   add_done_callback_Task__wakeupinspectZisgeneratorr   )rG   excrH   rW   blockingnew_excrI   r#   r$   Z__step   s   







61("zTask.__stepc              
   C   sR   z|   W n ty  } z| | W Y d }~d } d S d }~ww |   d } d S r   )rW   ro   rF   )rG   futurert   r#   r#   r$   Z__wakeup.  s   	
zTask.__wakeupr   )__name__
__module____qualname__r:   r7   rM   classmethodr   __class_getitem__rO   rQ   rS   r.   rX   r[   r]   r_   rc   rF   rr   __classcell__r#   r#   rI   r$   r   K   s"    
"Wr   )r1   c                C   s"   	 t  }|| }t|| |S r   )r   r   r   r2   )rH   r1   r"   r0   r#   r#   r$   r   K  s
   

r   )timeoutreturn_whenc                   s   	 t | st| rtdt| j | std|tt	t
fvr*td| t  t| } tdd | D rCt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: c                 s   s    | ]}t |V  qd S r   )r   r9   r'   fr#   r#   r$   	<genexpr>x  s    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.   
stacklevelc                       h | ]}t | d qS r!   r   r   r!   r#   r$   r)   ~      zwait.<locals>.<setcomp>)r   isfuturer   r9   r;   typerx   
ValueErrorr   r   r   r   r   setanywarningswarnDeprecationWarning_wait)fsr~   r   r#   r!   r$   r   ]  s    r   c                 G   s   |   s| d  d S d S r   )r&   rX   )waiterargsr#   r#   r$   _release_waiter     r   c              
      s  	 t  }|d u r| I d H S |dkrBt| |d} |  r!|  S t| |dI d H  z|  W S  tjyA } zt |d }~ww |	 }|
|t|}tt|}t| |d} | | zfz|I d H  W n& tjy   |  r}|   Y W |  S | | t| |dI d H   w |  r|  W |  S | | t| |dI d H  z
|  W W |  S  tjy } zt |d }~ww |  w )Nr   r!   )r   r   r   r&   rW   _cancel_and_waitr   rh   TimeoutErrorcreate_future
call_laterr   	functoolspartialrq   rc   remove_done_callback)futr~   r"   rt   r   timeout_handlecbr#   r#   r$   r     sZ   











r   c              
      s   	 |  d |d ur||tt|   fdd}| D ]}|| q"zI d H  W d ur9  | D ]}|| q;nd urL  | D ]}|| qNw t t }}| D ]}| rl|	| q`|	| q`||fS )Nc                    sj    d8   dkst kstkr-|  s/|  d ur1d ur"   s3d  d S d S d S d S d S )Nr   r   )r   r   	cancelledrZ   rc   r&   rX   r   Zcounterr   r   r   r#   r$   _on_completion  s   z_wait.<locals>._on_completion)
r   r   r   lenrq   rc   r   r   r&   add)r   r~   r   r"   r   r   r&   pendingr#   r   r$   r     s8   r   c              	      sR   	 |  }tt|}| | z|   |I d H  W | | d S | | w r   )r   r   r   r   rq   rc   r   )r   r"   r   r   r#   r#   r$   r     s   
r   )r~   c                #   s    	 t | st| rtdt| j ddlm} | t	
 fddt| D d  fdd}fdd	 fd
d}D ]}|  qHr\|d ur\||ttD ]}| V  qbd S )Nz#expect an iterable of futures, not r   )Queuec                    r   r   r   r   r!   r#   r$   r)   %  r   zas_completed.<locals>.<setcomp>c                     s*   D ]} |    d  q  d S r   )r   
put_nowaitclearr   )r   r&   todor#   r$   _on_timeout(  s   
z!as_completed.<locals>._on_timeoutc                    s<   sd S  |   |  sd ur  d S d S d S r   )remover   rc   r   )r&   r   r   r#   r$   r   .  s   

z$as_completed.<locals>._on_completionc                     s&      I d H } | d u rtj|  S r   )r    r   r   rW   r   )r&   r#   r$   _wait_for_one6  s
   z#as_completed.<locals>._wait_for_one)r   r   r   r9   r;   r   rx   queuesr   r   _get_event_loopr   rq   r   ranger   )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$   __sleep0E  s   
r   c                    s^   	 | dkrt  I d H  |S t }| }|| tj||}z
|I d H W |  S |  w )Nr   )r   r   r   r   r   r   Z_set_result_unless_cancelledrc   )delayrW   r"   rw   hr#   r#   r$   r	   Q  s   
r	   r!   c                C   s   	 t | |dS Nr!   )_ensure_future)coro_or_futurer"   r#   r#   r$   r   b  s   r   c                C   s   t | r|d ur|t | urtd| S d}t| s-t| r)t| } d}nt	d|d u r7t
jdd}z|| W S  tyK   |sJ|    w )NzRThe future belongs to a different loop than the one specified as the loop argumentFTz:An asyncio.Future, a coroutine or an awaitable is required   r   )r   r   r%   r   r   r9   rs   Zisawaitable_wrap_awaitabler;   r   r   r   r,   close)r   r"   Zcalled_wrap_awaitabler#   r#   r$   r   j  s&   


r   c                 c   s    	 |   E d H S r   )	__await__)Z	awaitabler#   r#   r$   r     s   r   c                       s(   e Zd Z	  fddZdddZ  ZS )_GatheringFuturec                   s   t  j|d || _d| _d S )Nr!   F)r6   r7   	_children_cancel_requested)rG   childrenr"   rI   r#   r$   r7     s   
z_GatheringFuture.__init__Nc                 C   s:   |   rdS d}| jD ]
}|j|drd}q|rd| _|S r`   )r&   r   rc   r   )rG   rb   retchildr#   r#   r$   rc     s   
z_GatheringFuture.cancelr   )rx   ry   rz   r7   rc   r}   r#   r#   rI   r$   r     s    r   F)return_exceptionsc                    s   	 |st  }| g  S  fdd}i }g  ddd }d |D ]3}||vrTt||d}|d u r?t|}||urFd|_d7 |||< || n|| } 	| q*t
 |dS )Nc                    s   d7 d u s  r|  s|   d S s6|  r'|  }| d S |  }|d ur6| d S kryg } D ]%} |  rRt| jd u rMdn| j}n|  }|d u r^|  }|	| q>j
rr|  }| d S | d S d S )Nr    )r&   r   rZ   ri   r[   r   rh   rd   rW   appendr   rX   )r   rt   resultsresr   Z	nfinishedZnfutsouterr   r#   r$   _done_callback  s>   

zgather.<locals>._done_callbackr   r!   Fr   )r   r   r   rX   r   r   r%   r:   rq   r   r   )r   Zcoros_or_futuresr"   r   Z
arg_to_futargr   r#   r   r$   r
     s6   
7
r
   c                    sZ   	 t |  rS t}| fdd  fdd}  | S )Nc                    s`      r|   s|   d S |   r   d S |  }|d ur' | d S  |   d S r   )r   rZ   rc   r[   rX   rW   )innerrt   r   r#   r$   _inner_done_callbackO  s   z$shield.<locals>._inner_done_callbackc                    s     s  d S d S r   )r&   r   r   )r   r   r#   r$   _outer_done_callback`  r   z$shield.<locals>._outer_done_callback)r   r&   r   r%   r   rq   )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               
      sZ   zt t d W d S  ttfy     ty, }  z
 r'|   d } ~ ww r   )r   Z_chain_futurer   rn   rm   ro   set_running_or_notify_cancelr[   )rt   rH   rw   r"   r#   r$   callbackr  s   
z*run_coroutine_threadsafe.<locals>.callback)r   r9   r;   
concurrentr   FutureZcall_soon_threadsafe)rH   r"   r   r#   r   r$   r   i  s   



r   c                 C      	 t |  d S r   )r+   r   r0   r#   r#   r$   r        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"   r0   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   r   r   )r+   discardr   r#   r#   r$   r     r   r   )r   r   r   r   r+   r   r   )B__all__concurrent.futuresr   rB   r   rs   	itertoolstypesr   weakrefr   r   r   r   r   r   r   r   count__next__r<   r   r   r2   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
&G,9


{B$