为什么 run_in_executor 放在 BaseEventLoop 中?

Why run_in_executor placed in BaseEventLoop?

例如,asyncio.gather 具有签名 asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False)

我可以通过特定循环或离开 None(将使用默认事件循环)。

为什么 BaseEventLoop.run_in_executor 没有以同样的方式定义,例如:asyncio.run_in_executor(executor, callback, *args, loop=None)?

如果有一些重要的原因将其放入 BaseEventLoop?

历史上run_in_executor很早就出现了,是一个事件循环的方法。它是根据线程池中 运行 代码的 twisted 方法建模的。出现后 run_in_executor 从未改变。 它是低级函数,接受回调并且与接受回调的其他函数非常接近,而不是协程:call_soon()call_later()add_reader() 等。所有这些都是事件循环的方法。

asyncio.gather 是在图书馆开发了大约一年之后才被邀请的。它位于更高的抽象级别,与协程一起工作,并与其他与协程相关的函数一起推送,如 wait()sleep().