我尝试使用asyncio并且必须将它与一些普通的多线程阻塞代码混合使用,因此我需要使用run_in_exector卸载执行。
asyncio docs warn that "most functions" aren't threadsafe,call_soon_threadsafe
是唯一的线程安全函数。还有一些其他的,如Future.add_done_callback
,也明确记录为线程安全。然后它有一个句子说"你可以使用run_in_executor在其他线程中运行回调"但是没有特别评论它的线程安全性。
run_in_executor不是线程安全的文档,但是查看源代码,如果采用正确的代码路径,它看起来是线程安全的。
有没有人知道假定是否是线程安全的,但是没有记录到那样的方式?
答案 0 :(得分:7)
run_in_executor
应该不是线程安全 规范(抱歉,它看起来像隐含声明,可能应该在PEP-3156中澄清)。< / p>
即使具体实现是线程安全的,也请不要认为任何符合PEP-3156的实现也是线程安全的。
答案 1 :(得分:3)
我认为这完全取决于你给它的东西。它实际上只是启动一个线程并运行你的代码,所以这是否是线程安全取决于你告诉它做什么。
答案 2 :(得分:3)
如果executor参数不是None或者已经设置了默认执行程序(调用loop.set_default_executor()),则默认实现看起来是线程安全的。否则,可能会创建两个执行程序。
您可以编写补丁以使该方法具有线程安全性; - )