第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Asyncio python:如何在協(xié)程中調(diào)用對(duì)象方法?

Asyncio python:如何在協(xié)程中調(diào)用對(duì)象方法?

我目前正在嘗試做這樣的事情:import asyncioclass Dummy:    def method(self):        return 1    def __str__(self):        return "THIS IS A DUMMY CLASS"async def start_doing():    asyncio.sleep(1)    return Dummyasync def do_something():    return start_doing().method()async def main():    a = asyncio.create_task(do_something())    b = asyncio.create_task(do_something())    results = await asyncio.gather(a, b)    print(results)asyncio.run(main())但我收到此錯(cuò)誤:AttributeError: 'coroutine' object has no attribute 'method'這表明我無(wú)法在協(xié)程對(duì)象上調(diào)用我的方法。解決此問(wèn)題的一種方法是執(zhí)行以下操作:async def do_something():    return (await start_doing()).method()但我認(rèn)為這樣做本質(zhì)上就是讓代碼同步。你不是在創(chuàng)造未來(lái),而是在等待你的工作完成do_something,然后繼續(xù)處理隊(duì)列中的下一項(xiàng)。awaitable當(dāng)已經(jīng)等待并且我的對(duì)象準(zhǔn)備好時(shí),我應(yīng)該如何在將來(lái)調(diào)用對(duì)象方法?如何安排它在未來(lái)被調(diào)用?
查看完整描述

2 回答

?
達(dá)令說(shuō)

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊

等待調(diào)用,然后在返回類的實(shí)例上調(diào)用該方法。


async def start_doing():

    await asyncio.sleep(1)

    return Dummy



async def do_something():

    thing = await start_doing()

    return thing().method()

當(dāng)?shù)却龑?duì)象已經(jīng)等待并且我的對(duì)象已準(zhǔn)備好時(shí),我應(yīng)該如何在將來(lái)調(diào)用對(duì)象方法?如何安排它在未來(lái)被調(diào)用?


看看我能不能弄對(duì)。


當(dāng)您創(chuàng)建任務(wù)do_something時(shí),它會(huì)被安排。

最終事件循環(huán)決定讓我們do_something開(kāi)始。

do_something呼叫start_doing并等待它。

在do_something等待的過(guò)程中,事件循環(huán)將控制權(quán)從它手中奪走,讓其他事情發(fā)生。

在某些時(shí)間點(diǎn)start_doing被調(diào)度,開(kāi)始,完成等待/休眠,返回對(duì)象

在等待/睡眠部分控制可能已通過(guò)事件循環(huán)轉(zhuǎn)移到其他任務(wù)

最終在do_something等待事件循環(huán)完成后將控制權(quán)/焦點(diǎn)交還給它。

暗示其他計(jì)劃任務(wù)已經(jīng)完成或正在等待某事。

我真的不知道調(diào)度算法是什么,我認(rèn)為它是一個(gè)循環(huán)事件,但它可能比這更智能。


查看完整回答
反對(duì) 回復(fù) 2023-02-07
?
動(dòng)漫人物

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊

要進(jìn)一步擴(kuò)展@wwii答案并解決有關(guān)阻塞風(fēng)險(xiǎn)的擔(dān)憂,await您可以使用以下功能f


import time

from datetime import datetime

import asyncio


start = datetime.now()


async def f(x, block_for=3):

    print(f"{x} IN     {ellapsed_time()}s")

    time.sleep(block_for)

    print(f"{x} AWAIT  {ellapsed_time()}s")

    await asyncio.sleep(x)

    print(f"{x} OUT    {ellapsed_time()}s")

    

def ellapsed_time():

    return (datetime.now() - start).seconds

    


asyncio.create_task(f(2))

asyncio.create_task(f(1))

哪個(gè)產(chǎn)生:


2 IN     0s

2 AWAIT  3s

1 IN     3s

1 AWAIT  6s

2 OUT    6s

1 OUT    7s

Untilawait被調(diào)用,f(2)正在阻塞(阻止任何其他任務(wù)被調(diào)度)。一旦我們調(diào)用await,我們就明確地通知調(diào)度程序我們正在等待某事(通常是 I/O,但這里只是“睡眠”)。類似地,在它調(diào)用之前f(1)阻止f(2)出去await。


如果我們刪除阻塞部分(阻塞 0s)f(1)將被重新安排到執(zhí)行之前f(2),因此將首先完成:


>>> start = datetime.now()

>>> asyncio.create_task(f(2, block_for=0))

>>> asyncio.create_task(f(1, block_for=0))


2 IN     0s

2 AWAIT  0s

1 IN     0s

1 AWAIT  0s

1 OUT    1s

2 OUT    2s

最后,關(guān)于這部分:


......如何安排它在未來(lái)被調(diào)用?


你可以看看python中的asyncio.sleep()是怎么實(shí)現(xiàn)的?,它可能會(huì)幫助您更好地理解異步編程的工作原理。


查看完整回答
反對(duì) 回復(fù) 2023-02-07
  • 2 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)