python asyncio:在协程中等待另一个协程的中间结果
python asyncio: Wait in coroutine for intermediate result of another coroutine
我在不同的 类(class_A
、class_B
)中有 2 个协程(co_A
、co_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
我在不同的 类(class_A
、class_B
)中有 2 个协程(co_A
、co_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