为什么我的异步函数没有并行运行?

问题描述 投票:0回答:2

我正在尝试理解Python中的asyncio。我期望我的两个异步函数同时运行,输出类似于下面。

foo
bar
foo
bar
foo
bar
foo
bar

相反,我得到了“foo”列表。

async def print_foo():
    while True:
        print("foo")

async def print_bar():
    while True:
        print("bar")

async def main():
    async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(print_foo())
        task2 = tg.create_task(print_bar())

if __name__ == "__main__":
    asyncio.run(main())

有人可以解释为什么我会看到这种行为以及如何让两个异步函数同时运行吗?

python asynchronous python-asyncio
2个回答
0
投票

我认为你的第一个

while True
只需要缩进即可。它在函数外部被调用。

尝试:

async def print_foo():
    while True:
        print("foo")

async def print_bar():
    while True:
        print("bar")

async def main():
    async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(print_foo())
        task2 = tg.create_task(print_bar())

if __name__ == "__main__":
    asyncio.run(main())

0
投票

while
print_foo
中的
print_bar
循环阻止事件循环处理已提交运行的其他异步任务。解决此问题的一种方法是使用
asyncio.sleep
返回事件循环:

import asyncio
async def print_foo():
   while True:
      print('foo')
      await asyncio.sleep(0)

async def print_bar():
   while True:
      print('bar')
      await asyncio.sleep(0)

async def main():
   async with asyncio.TaskGroup() as tg:
      task1 = tg.create_task(print_foo())
      task2 = tg.create_task(print_bar())

asyncio.run(main())

输出:

foo
bar
© www.soinside.com 2019 - 2024. All rights reserved.