asyncio的loop.run_in_executor是线程安全的吗?

时间:2014-12-17 20:40:50

标签: python thread-safety python-asyncio

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

asyncio docs warn that "most functions" aren't threadsafecall_soon_threadsafe是唯一的线程安全函数。还有一些其他的,如Future.add_done_callback,也明确记录为线程安全。然后它有一个句子说"你可以使用run_in_executor在其他线程中运行回调"但是没有特别评论它的线程安全性。

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

有没有人知道假定是否是线程安全的,但是没有记录到那样的方式?

3 个答案:

答案 0 :(得分:7)

run_in_executor应该不是线程安全 规范(抱歉,它看起来像隐含声明,可能应该在PEP-3156中澄清)。< / p>

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

您可以编写补丁以使该方法具有线程安全性; - )