如何在 Python 3.6 中执行 2 个协程

Jen*_*nov 5 python python-3.x

我无法在 Python 3.6 程序中并行执行两个协程。下面是一个例子:

import asyncio, time

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(start_coros())


async def start_coros():
    await coro1()
    await coro2()


async def coro1():
    print("coro1")
    time.sleep(3000)


async def coro2():
    print("coro2 - we want to get here")


if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个协程首先执行,但第二个协程不会并发运行。

你能给我一个关于如何同时运行它们的提示吗?

预先感谢您的帮助

VPf*_*PfB 3

要“并行”运行两个协程,请创建任务:

async def start_coros():
    # ensure_future -> create_task in Python 3.7
    tasks = [asyncio.ensure_future(coro()) for coro in (coro1, coro2)]
    await asyncio.wait(tasks)
Run Code Online (Sandbox Code Playgroud)

然而,存在一个巨大的问题coro1asyncio基于协作调度。一次只能运行一个协程。调度程序在协程之间切换,但这只有在正在运行的协程等待某些内容时才会发生。如果协程在 之间花费太多时间awaits,程序就会显得不响应。所以要避免time.sleep()

async def coro1():
    print("coro1")
    await asyncio.sleep(3000)
Run Code Online (Sandbox Code Playgroud)