12

我正在尝试 asyncio 并且必须将它与一些普通的多线程阻塞代码混合,所以我需要使用 run_in_execector 卸载执行。

asyncio文档警告说“大多数函数”不是线程安全的,这call_soon_threadsafe是唯一的线程安全函数。还有一些其他的,例如Future.add_done_callback,也被明确记录为线程安全的。然后它后面有一句话说“你可以使用 run_in_executor 在其他线程中运行回调”,但没有具体评论它的线程安全性。

run_in_executor 文档不是线程安全的,但是查看源代码,如果采用正确的代码路径,它看起来是线程安全的。

有谁知道它是否应该是线程安全的,但只是没有记录是这样的吗?

4

3 回答 3

7

run_in_executor规范应该不是线程安全的(对不起,它看起来像隐式声明,可能应该在 PEP-3156 中澄清)。

即使具体实现是线程安全的,请不要假设任何符合 PEP-3156 的实现也是线程安全的。

于 2014-12-22T14:00:16.807 回答
3

我认为这完全取决于你给它什么。它实际上只是启动一个线程并运行你的代码,所以这是否是线程安全的取决于你告诉它做什么。

于 2014-12-18T16:29:56.350 回答
3

如果 executor 参数不是 None 或者已经设置了默认执行器(调用 loop.set_default_executor()),默认实现看起来是线程安全的。否则,可能会创建两个执行器。

您可以编写一个补丁来使该方法线程安全;-)

于 2015-02-05T00:00:53.900 回答