你好,我想知道。如何等待另一个线程和另一个循环的asyncio.Future?例如。我有一个等待协程结果的代码
if isinstance(target, Future):
await target
result = target
但是问题是此代码是从另一个线程运行的。而且我有一个例外
让Future连接到另一个循环
问题:如何等待另一个线程的asyncio.Future?
P.S。我知道我必须使用一个Loop,但是我的解决方案的体系结构需要启动一个单独的线程并等待asyncio.Future
完成答案 0 :(得分:1)
如何从另一个线程和另一个循环中等待asyncio.Future?
您不应该这样做。即使您需要另一个线程,也可以始终使用asyncio.run_coroutine_threadsafe
将工作提交到现有的单个事件循环。
但是,如果您真的真的需要这样做,可以这样做(未经测试),尽管我强烈建议不要这样做。这将暂时解决严重的体系结构问题, 会再次困扰您。
if isinstance(target, Future):
my_loop = asyncio.get_running_loop()
if target.get_loop() is my_loop:
result = await target
else:
target_loop = target.get_loop()
my_target = my_loop.create_future()
def wait_target():
try:
result = await target
except Exception as e:
my_loop.call_soon_threadsafe(my_target.set_exception, e)
else:
my_loop.call_soon_threadsafe(my_target.set_result, result)
target_loop.call_soon_threadsafe(wait_target)
result = await my_target