为什么并发.futures.Future会引发asyncio.Future错误?

时间:2018-06-21 11:58:59

标签: python python-3.x python-asyncio concurrent.futures

我有一些与以下代码段等效的内容:

import asyncio

futures = []
loop = asyncio.get_event_loop()
for coroutine in coroutines:
    futures.append(asyncio.run_coroutine_threadsafe(coroutine, loop))
for future in futures:
    future.result()

这引发了以下错误:

in main
    future.result()
  File "/usr/lib/python3.5/asyncio/futures.py", line 268, in result
    raise InvalidStateError('Result is not ready.')

asyncio.Future会引发错误,但是asyncio.run_coroutine_threadsafe should return a concurrent.futures.Future会引发错误(如果错误未准备好,则会阻止而不是引发错误)。

看看asyncio.run_coroutine_threadsafe的实现,有一行使我认为它是将asyncio.Future链接到concurrent.futures.Future

futures._chain_future(ensure_future(coro, loop=loop), future)

无论问题出在哪里,它在大多数情况下都有效。这是试图描述尚未证明可重现的已报告错误。

谁能阐明正在发生的事情?

1 个答案:

答案 0 :(得分:0)

自从有人问了已经有一段时间了,但我认为您是因为run_coroutine_threadsafe的这一部分而出现了此异常:

except BaseException as exc:
    if future.set_running_or_notify_cancel():
        future.set_exception(exc)
        raise

这实质上是采取了上一步中发生的异常,并将其附加到concurrent.futures.Future。这意味着您可以获得InvalidStateError引发的异步BaseException(继承自concurrent.futures.Future)。这并不意味着Future是一个异步的Future。但是,这意味着您的错误可能来自ensure_future代码的run_coroutine_threadsafe部分。