为什么 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()
.
例如,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()
.