python - 在 python asyncio 中,是否可以在不等待完成的情况下调用另一个任务?
问题描述
目前task1需要等待task2完成。现在我需要task2看起来像另一个线程而不影响task1的执行,如何实现呢?
async def task2():
await asyncio.sleep(3)
print("task2")
async def task1():
await task2()
print("task1")
async def main(loop):
task = loop.create_task(task1())
await task
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
解决方案
您可以使用asyncio.gather()
它同时运行您传递给它的每个任务。每个协程中的代码同步执行,直到到达一个await
关键字,将控制权传递回事件循环。
如果您想task2
被“启动” task1
,您可以使用asyncio.Event
等待,直到在task2中设置了一个事件,然后在task1中设置该事件。
请参阅修改后的示例。两个任务同时使用asyncio.gather
. 但task2
在事件从task1
.
import asyncio
async def task2(event):
print("starting task2")
await event.wait()
print("event set")
await asyncio.sleep(3)
print("task2 end")
async def task1(event):
print("starting task1")
event.set()
await asyncio.sleep(5)
print("task1 end")
async def main(loop):
event = asyncio.Event()
await asyncio.gather(
task1(event),
task2(event)
)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
我添加了一些打印语句,一个 3 秒睡眠到task2
,一个 5 秒睡眠到task1
。由于它们同时运行,输出将是:
starting task1
starting task2
event set
task2 end
task1 end
推荐阅读
- graph - ArangoDB 从一个文档创建集合和图形
- php - Mysqli_Connect 是一个未定义的函数
- java - 我对 Dockerfile 进行了更改,但我的“docker build”并未反映更改
- ruby-on-rails - 分区数据库表的 Rails 迁移索引名称太长
- aframe - 我无法在框架中添加图像
- android - Android Studio AVD 导致 avd 崩溃,AS 无警告关闭
- sql - 如何正确地将 SELECT DISTINCT ON 应用于我的 SUM() 查询
- azure - Azure 应用程序网关正在将请求重定向到应用服务
- c++ - 如何在头文件中声明几个二维数组和指向它的指针,并在 cpp 文件中定义它们
- css - 在 R 中使用 CSS 自定义 ioslides