我对这个简单异步示例理解错了什么
我对如何使用asyncio有点搞不清楚。能不能帮我解决这个问题?假设我有一个输入输出的任务,执行需要8秒,我把它放在了协程task()里。我想要运行一个无限循环,每5秒执行一次这个任务,但又不想让我的代码卡住。
import asyncio
async def task():
print('starting task')
await asyncio.sleep(8)
print('finished task')
async def main():
count = 0
while True:
print(count)
if count % 5 == 0:
print('running task')
await task()
count += 1
await asyncio.sleep(1)
asyncio.run(main())
根据我对文档的理解,当我在task
这个协程里使用await
时,它应该回到执行main
,但这并没有发生。我哪里做错了呢?我的输出是
0
running task
starting task
finished task
1
2
3
4
5
running task
starting task
finished task
6
7
8
9
10
1 个回答
2
你的问题在于你在等待一个协程,这个协程的作用就是它会让其他事情都停下来,直到它完成(说它不回到主程序也不太准确。它确实会回去,只是比你想的晚)。如果把它放到另一个不需要等待的任务中,就可以让它“在后台运行”。
import asyncio
async def task():
print('starting task')
await asyncio.sleep(8)
print('finished task')
async def main():
count = 0
while True:
print(count)
if count % 5 == 0:
print('running task')
asyncio.create_task(task())
count += 1
await asyncio.sleep(1)
asyncio.run(main())
这样做给我的结果,我觉得这正是你想要的。
0
running task
starting task
1
2
3
4
5
running task
starting task
6
7
finished task
8
9
10
running task
starting task
11
12
finished task
13
14