python - asyncio - 代码同步执行
问题描述
我是 python 初学者,从https://www.youtube.com/watch?v=iG6fr81xHKA&t=269s了解 asyncio 的强大功能,我尝试使用显示的这个示例并将其重新用于执行 10 次。这是一个代码片段
def main(x):
print("Hello")
time.sleep(3)
print("World!")
因此,我尝试以异步方式执行此操作,但它不会异步执行。到目前为止,这是我尝试过的。我究竟做错了什么?
import time
import asyncio
async def main(x):
print(f"Starting Task {x}")
await asyncio.sleep(3)
print(f"Finished Task {x}")
async def async_io():
for i in range(10):
await main(i)
if __name__ == "__main__":
start_time = time.perf_counter()
asyncio.run(async_io())
print(f"Took {time.perf_counter() - start_time} secs")
我也尝试在 asyncio 中使用 queue_task。
解决方案
根据await
定义,使用 等待任务main
完成。因此,您的代码原样与您在上面发布的同步代码没有什么不同。如果您想同时(异步)运行它们,在等待结果的同时,您应该使用asyncio.gather
orasyncio.wait
代替。
async def async_io():
tasks = []
for i in range(10):
tasks += [main(i)]
await asyncio.gather(*tasks)
如果您不想等待所有main()
调用完成,您也可以只使用asyncio.create_task(main(i))
,它会创建一个Task
对象并安排其在后台执行。在这种情况下,def async_io()
不再需要异步。
推荐阅读
- php - 从控制器传递变量以查看并使用变量显示数据
- .net - Visual Studio 社区 2019 不显示设计器视图
- python - QTableWidget:删除或扩展到整行单元格的活动突出显示
- netsuite - 尝试使用 Suitescript 创建发票时的 INVALID_KEY_OR_REF
- css - 如何在 mat-menu 内将 mat-grid 显示为响应式
- laravel - 如何通过流明中的作曲家安装照明/邮件
- flutter - Flutter 在桌面应用程序中的 UI 内拖放
- c# - 在带有选择的 LINQ 中,我可以向前比较下一行并决定选择什么吗?
- sqlite - TypeError:无法读取未定义的属性“then”。插件科尔多瓦的问题?
- vue.js - 有没有办法在 vuejs 中压缩 app.js 文件