gpt4 book ai didi

python - await 如何在协程链接期间将控制权交还给事件循环?

转载 作者:太空狗 更新时间:2023-10-30 00:58:43 25 4
gpt4 key购买 nike

我正在尝试使用 Python 3.6 中的 asyncio,但很难弄清楚为什么这段代码会以现在的方式运行。

示例代码:

import asyncio

async def compute_sum(x, y):
print("Compute %s + %s ..." % (x, y))
await asyncio.sleep(5)
print("Returning sum")
return x + y

async def compute_product(x, y):
print("Compute %s x %s ..." % (x, y))
print("Returning product")
return x * y

async def print_computation(x, y):
result_sum = await compute_sum(x, y)
result_product = await compute_product(x, y)
print("%s + %s = %s" % (x, y, result_sum))
print("%s * %s = %s" % (x, y, result_product))

loop = asyncio.get_event_loop()
loop.run_until_complete(print_computation(1, 2))

输出:

Compute 1 + 2 ...
Returning sum
Compute 1 x 2 ...
Returning product
1 + 2 = 3
1 * 2 = 2

预期输出:

Compute 1 + 2 ...
Compute 1 x 2 ...
Returning product
Returning sum
1 + 2 = 3
1 * 2 = 2

我对预期输出的推理:

虽然 compute_sum 协程在 compute_product 协程之前被正确调用,但我的理解是,一旦我们点击 await asyncio.sleep(5),控制将被传递回事件循环,事件循环将开始compute_product 协程的执行。为什么在我们命中 compute_product 协程中的打印语句之前执行“返回总和”?

最佳答案

关于协程的工作原理,你是对的;您的问题在于您如何调用他们。特别是:

result_sum = await compute_sum(x, y)

这会调用协程 compute_sum 然后等待直到完成

因此,compute_sum 确实在 await asyncio.sleep(5) 中屈服于调度程序,但没有其他人可以唤醒。您的 print_computation coro 已经在等待 compute_sum。而且还没有人启动 compute_product,所以它肯定无法运行。

如果你想启动多个协程并让它们同时运行,不要await每一个;你需要一起等待他们中的很多人。例如:

async def print_computation(x, y):
awaitable_sum = compute_sum(x, y)
awaitable_product = compute_product(x, y)
result_sum, result_product = await asyncio.gather(awaitable_sum, awaitable_product)
print("%s + %s = %s" % (x, y, result_sum))
print("%s * %s = %s" % (x, y, result_product))

(awaitable_sum 是裸协程、Future 对象还是其他可以await 的对象并不重要; gather 两种方式都有效。)

或者,也许更简单:

async def print_computation(x, y):
result_sum, result_product = await asyncio.gather(
compute_sum(x, y), compute_product(x, y))
print("%s + %s = %s" % (x, y, result_sum))
print("%s * %s = %s" % (x, y, result_product))

参见 Parallel execution of tasks在示例部分。

关于python - await 如何在协程链接期间将控制权交还给事件循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49227242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com