我有一些与以下代码段等效的内容:
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)
无论问题出在哪里,它在大多数情况下都有效。这是试图描述尚未证明可重现的已报告错误。
谁能阐明正在发生的事情?
答案 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
部分。