我如何等待另一个线程和另一个循环的asyncio.Future

时间:2019-09-06 10:05:22

标签: python multithreading python-asyncio

你好,我想知道。如何等待另一个线程和另一个循环的asyncio.Future?例如。我有一个等待协程结果的代码

 if isinstance(target, Future):
            await target
            result = target

但是问题是此代码是从另一个线程运行的。而且我有一个例外

  

让Future连接到另一个循环

问题:如何等待另一个线程的asyncio.Future?

P.S。我知道我必须使用一个Loop,但是我的解决方案的体系结构需要启动一个单独的线程并等待asyncio.Future

完成

1 个答案:

答案 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