我对这个简单异步示例理解错了什么

2 投票
1 回答
37 浏览
提问于 2025-04-13 02:22

我对如何使用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

撰写回答