B §@s<dZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl m Z ddl mZd=d d Zd>d d Zd?d dZGddde jZeZy ddlZWnek rYn XejZZddZej jZej jZej jZddedddZddZddddZddZddZ dddd d!Z!ejd"d#Z"d@ddd$d%Z#ddd&d'Z$ed(d)Z%Gd*d+d+e j&Z'dd,d-d.d/Z(ddd0d1Z)d2d3Z*e+Z,iZ-d4d5Z.d6d7Z/d8d9Z0d:d;Z1e.Z2e1Z3e/Z4e0Z5y$dd5szall_tasks..)rrlist _all_tasks RuntimeError)ritasksr)rr r"s rcsbdkrtd}x:y tt}Wn&tk rH|d7}|dkrDYqXPqWfdd|DS)Nrricsh|]}t|kr|qSr)rr!)r#r$)rrr r%Nsz$_all_tasks_compat..)rget_event_loopr&r'r()rr)r*r)rr _all_tasks_compat9s r,cseZdZdZedddZedddZddfdd Zfd d Zd d Z ddZ ddZ ddddZ dddddZ ddZd fdd ZddZZS)!rTNcCs(tjdtdd|dkr t}t|S)NzETask.current_task() is deprecated, use asyncio.current_task() instead) stacklevel)warningswarnPendingDeprecationWarningrr+r)clsrrrr rcs zTask.current_taskcCstjdtddt|S)Nz?Task.all_tasks() is deprecated, use asyncio.all_tasks() insteadr-)r.)r/r0r1r,)r2rrrr rsszTask.all_tasks)rcsvtj|d|jr|jd=t|s:d|_td|d|_d|_||_ t |_ |j j|j|j dt|dS)N)rFza 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)selfcoror) __class__rr r6s  z Task.__init__csF|jtjkr8|jr8|dd}|jr,|j|d<|j|tdS)Nz%Task was destroyed but it is pending!)taskmessageZsource_traceback) Z_staterZ_PENDINGr9r7r@Zcall_exception_handlerr5__del__)rCr4)rErr rHs  z Task.__del__cCs t|S)N)rZ_task_repr_info)rCrrr _repr_infoszTask._repr_infocCs tddS)Nz*Task does not support set_result operation)r()rCresultrrr set_resultszTask.set_resultcCs tddS)Nz-Task does not support set_exception operation)r()rC exceptionrrr set_exceptionszTask.set_exception)limitcCs t||S)N)rZ_task_get_stack)rCrNrrr get_stackszTask.get_stack)rNfilecCst|||S)N)rZ_task_print_stack)rCrNrPrrr print_stacks zTask.print_stackcCs4d|_|rdS|jdk r*|jr*dSd|_dS)NFT)Z_log_tracebackr"r<cancelr;)rCrrr rRs  z Task.cancelc s|rtd|d||jr>t|tjs8t}d|_|j}d|_t|j |zhy"|dkrp| d}n | |}Wnt k r}z0|jrd|_t tnt |jWdd}~XYntjk rt Yntk r}zt |Wdd}~XYntk rN}zt |Wdd}~XYnpXt|dd}|dk rBt||j k rtd|d|d}|j j|j||jdn|r||krtd |}|j j|j||jdn8d|_|j|j|jd||_|jr@|jr@d|_n*td |d |}|j j|j||jdn||dkrb|j j|j|jdn\t|rtd |d |}|j j|j||jdn$td |}|j j|j||jdWdt|j |d}XdS)Nz_step(): already done: z, F_asyncio_future_blockingzTask z got Future z attached to a different loop)r4zTask 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 zTask got bad yield: ) r"rZInvalidStateErrorr; isinstanceCancelledErrorr=r<rr@sendthrow StopIterationr5rMrKvaluerR Exception BaseExceptiongetattrr!r(rArBr?rSadd_done_callback _Task__wakeupinspectZ isgeneratorr)rCexcrDrJZblockingnew_exc)rErr Z__steps|             z Task.__stepc CsJy |Wn,tk r8}z||Wdd}~XYn X|d}dS)N)rJrZrB)rCfuturer`rrr Z__wakeup<s  z Task.__wakeup)N)N)N)__name__ __module__ __qualname__r9 classmethodrrr6rHrIrKrMrOrQrRrBr^ __classcell__rr)rEr rQs    !TrcCst}||S)N)rrr)rDrrrr rYsr)rtimeout return_whencst|st|r(tdt|j|s4td|tt t fkrPtd|dkr`t fddt |D}t|||IdHS)Nzexpect a list of futures, not z#Set of coroutines/Futures is empty.zInvalid return_when value: csh|]}t|dqS))r)r )r#f)rrr r%szwait..)risfuturerr8r:typerc ValueErrorrrrrr+set_wait)fsrrhrir)rr risrcGs|s|ddS)N)r"rK)waiterargsrrr _release_waitersrs)rcs|dkrt}|dkr"|IdHS|dkrVt||d}|rF|S|t|}| |t |}t t |}t||d}| |zry|IdHWn*tjk r|||YnX|r|S||t||dIdHtWd|XdS)Nr)r)rr+r r"rJrRr TimeoutError create_future call_laterrs functoolspartialr]rUremove_done_callback_cancel_and_wait)futrhrrqtimeout_handlecbrrr rs8         rc s|d|dk r"||tt|fdd}x|D]}||qBWzIdHWddk rtx|D]}||qzWXtt}}x*|D]"}|r| |q| |qW||fS)NcsZd8dks4tks4tkrV|sV|dk rVdk rDsVddS)Nrr)rr cancelledrLrRr"rK)rj)counterrir|rqrr _on_completions z_wait.._on_completion) rurvrslenr]rRryrnr"add)rprhrirrrjr"Zpendingr)rrir|rqr ros(    roc sF|}tt|}||z||IdHWd||XdS)N)rurwrxrsr]rRry)r{rrqr}rrr rzs  rz)rrhc#st|st|r(tdt|jdk r4ntfddt |Dddl m }|ddfdd}fd d fd d }xD]}| qWr|dk rȈ ||xttD] }|VqWdS) Nzexpect a list of futures, not csh|]}t|dqS))r)r )r#rj)rrr r%szas_completed..r)Queue)rcs.x D]}|dqWdS)N)ry put_nowaitclear)rj)rr"todorr _on_timeouts  z!as_completed.._on_timeoutcs4sdS||s0dk r0dS)N)removerrR)rj)r"r|rrr r#s    z$as_completed.._on_completioncs$IdH}|dkrtj|S)N)rrrtrJ)rj)r"rr _wait_for_one+sz#as_completed.._wait_for_one)rrkrr8r:rlrcrr+rnZqueuesrr]rvranger)rprrhrrrrj_r)rr"rr|rr rs       rccs dVdS)Nrrrrr __sleep0:s rcs\|dkrtIdH|S|dkr(t}|}||tj||}z |IdHS|XdS)Nr)rrr+rurvrZ_set_result_unless_cancelledrR)ZdelayrJrrbhrrr r Fs  r cCst|r6|dkrt}||}|jr2|jd=|St|rb|dk r^|t|k r^t d|St |r|t t ||dStddS)Nr3z$loop argument must agree with Future)rz:An asyncio.Future, a coroutine or an awaitable is required)rr8rr+rr7rrkr!rmr_Z isawaitabler _wrap_awaitabler:)Zcoro_or_futurerrFrrr r Xs    r ccs|EdHS)N) __await__)Z awaitablerrr rosrcs*eZdZddfdd ZddZZS)_GatheringFutureN)rcstj|d||_d|_dS)N)rF)r5r6 _children_cancel_requested)rCchildrenr)rErr r6sz_GatheringFuture.__init__cCs:|r dSd}x|jD]}|rd}qW|r6d|_|S)NFT)r"rrRr)rCretZchildrrr rRs z_GatheringFuture.cancel)rcrdrer6rRrgrr)rEr rysrF)rreturn_exceptionscs|s*|dkrt}|gSfdd}i}gddxn|D]f}||krt||d}|dkr~t|}||k rd|_d7|||<||n||} |qTWt |dS)Ncsd7r$|s |dSsd|rFt}|dS|}|dk rd|dSkrg}x@D]8}|rt}n|}|dkr|}||qvWjrȈtn  |dS)Nr) r"r~rLrrUrMrJappendrrK)r{r`resultsZres)r nfinishednfutsouterrrr _done_callbacks4    zgather.._done_callbackr)rFr) rr+rurKr rr!r9r]rr)rrZcoros_or_futuresrZ arg_to_futargr{r)rrrrrr r s2 1     r cs\t||drSt}|fddfdd}|S)N)rcs\r|s|dS|r.n*|}|dk rJ|n|dS)N)r~rLrRrMrKrJ)innerr`)rrr _inner_done_callback#s  z$shield.._inner_done_callbackcssdS)N)r"ry)r)rrrr _outer_done_callback4sz$shield.._outer_done_callback)r r"rr!rur])rrrr)rrrr r s     r cs:tstdtjfdd}|S)NzA coroutine object is requiredc sTyttdWn6tk rN}zr<|Wdd}~XYnXdS)N)r)rZ _chain_futurer rZZset_running_or_notify_cancelrM)r`)rDrbrrr callbackFs  z*run_coroutine_threadsafe..callback)rr8r: concurrentrFutureZcall_soon_threadsafe)rDrrr)rDrbrr r =s    r cCst|dS)N)r'r)rFrrr rZsrcCs4t|}|dk r(td|d|d|t|<dS)NzCannot enter into task z while another task z is being executed.)rrr()rrFrrrr r_s rcCs2t|}||k r(td|d|dt|=dS)Nz Leaving task z! does not match the current task .)rrr()rrFrrrr rgs rcCst|dS)N)r'discard)rFrrr rosr)rrrrr'r)N)N)N)N):__all__concurrent.futuresrr>rwr_typesr/weakrefrrrrrrrr,Z _PyFuturerZ_PyTaskZ_asyncio ImportErrorZ_CTaskrrrrrrsrrorzrrr r rrrr r r ZWeakSetr'rrrrrZ_py_register_taskZ_py_unregister_taskZ_py_enter_taskZ_py_leave_taskZ_c_register_taskZ_c_unregister_taskZ _c_enter_taskZ _c_leave_taskrrrr sv        }   9,7  m;$