python asyncio:在协程中等待另一个协程的中间结果

python asyncio: Wait in coroutine for intermediate result of another coroutine

我在不同的 类(class_Aclass_B)中有 2 个协程(co_Aco_B),它们由调度程序定期调用。 在执行期间的某个时间 co_B 需要 co_A 在其 运行.

期间计算的结果

我想做的是这样的:

class class_A:
    async def co_A(self):

        # execute time consuming code

        # set result that co_B needs
        self.set_result(result)

        # execute more time consuming code

class class_B:
    async def co_B(self):

        # execute time consuming code

        # wait for result from co_A
        result = await class_A_instance.get_result()

        # execute more time consuming code

我的方法是在 class_A 中有一个空的 Future,它在 co_A 期间被填充,在 co_B 中循环等待直到 Future 被设置:

class class_A:
    async def prepare(self):
        self.fut = asyncio.Future()

    async def co_A(self):

        # execute time consuming code

        # set result that co_B needs
        self.fut.set_result(result)

        # execute more time consuming code

class class_B:   
    async def co_B(self):

        # execute time consuming code

        # wait for result from co_A
        while not class_A_instance.fut.done():
            await asyncio.sleep(0)

        result = class_A_instance.fut.result()

        # execute more time consuming code

有没有更好的方法来做到这一点,而不必在循环中休眠直到 co_A 计算出结果?

futures 的整体理念是您可以等待它,就像等待协程、任务等一样。

class class_B:   
    async def co_B(self):

        # execute time consuming code

        # wait for result from co_A
        result = await class_A_instance.fut

        # execute more time consuming code

参见第 "Things a coroutine can do" here

我会使用 Event class 来同步协程。 @Mikhail 方法 100% 正确,但没有解决您希望在 co_A.

中间收到通知的问题
class A:
    def __init__(self):
        self.partially_ready = asyncio.Event()

    async def prepare(self):
        self.partially_ready.clear()

    async def co_A(self):   
        # execute time consuming code

        # set result that co_B needs
        self.partially_ready.set()
        # execute more time consuming code


class class_B:   
    async def co_B(self):

        # execute time consuming code

        # wait for result from co_A
        await A_instance.partially_ready.wait()
        # here A_instance finished some part you would like to wait