[英]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.