簡體   English   中英

如何在python 3.5+中使用async / await

[英]How to use async/await in python 3.5+

我試圖在python中解釋一個異步編程的例子,但我失敗了。 這是我的代碼。

import asyncio
import time

async def asyncfoo(t):
    time.sleep(t)
    print("asyncFoo")


loop = asyncio.get_event_loop()
loop.run_until_complete(asyncfoo(10)) # I think Here is the problem
print("Foo")
loop.close()

我的期望是我會看到:

Foo
asyncFoo

在顯示asyncFoo之前等待10秒。

但相反,我沒有得到任何10秒,然后他們都顯示。

我做錯了什么,怎么解釋呢?

run_until_complete將阻塞,直到asyncfoo完成。 相反,你需要在循環中執行兩個協同程序。 使用asyncio.gather輕松啟動多個協程與run_until_complete

這是一個例子:

import asyncio


async def async_foo():
    print("asyncFoo1")
    await asyncio.sleep(3)
    print("asyncFoo2")


async def async_bar():
    print("asyncBar1")
    await asyncio.sleep(1)
    print("asyncBar2")


loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(async_foo(), async_bar()))
loop.close()

您的期望將在您將協程作為獨立於代碼流程的Task運行的上下文中Task 它可以工作的另一種情況是你並行運行多個coroutines ,在這種情況下,事件循環將把代碼執行從await轉移到await語句。

在您的示例的上下文中,您可以通過將協程包裝在Task對象中來實現預期的行為,該對象將在后台繼續運行,而不會阻止代碼塊中的其余代碼從其調用。

例如。

import asyncio

async def asyncfoo(t):
    await asyncio.sleep(t)
    print("asyncFoo")

async def my_app(t):
    my_task = asyncio.ensure_future(asyncfoo(t))
    print("Foo")
    await asyncio.wait([my_task])

loop = asyncio.get_event_loop()
loop.run_until_complete(my_app(10))
loop.close()

請注意,您應該使用asyncio.sleep()而不是time模塊。

run_until_complete阻塞。 所以,即使它會在10秒內發生,它也會等待它。 完成后,將發生其他打印。

如果要在之前打印“Foo”,則應在線程或子進程中啟動loop.run_until_complete(asyncfoo(10))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM