我有一些使用交互式加载 python 模块的函数__import__
我最近偶然发现了一些关于 Python 中的“导入锁”的文章,即专门用于导入的锁(不仅仅是 GIL)。但是这篇文章很旧,所以也许这不再是真的了。
这让我想知道在线程中导入的做法。
import
/__import__
线程安全吗?- 他们可以创建死锁吗?
- 它们会导致线程应用程序中的性能问题吗?
编辑 2012 年 9 月 12 日
感谢 Soravux 的精彩回复。所以导入是线程安全的,我不担心死锁,因为__import__
在我的代码中使用的函数不会相互调用。
即使模块已经导入,您是否知道是否获得了锁?如果是这种情况,我可能应该在 sys.modules 中查看模块是否已经被导入,然后再调用__import__
.
当然,这在 CPython 中应该不会有太大的不同,因为无论如何都有 GIL。但是,它可能会对 Jython 或无堆栈 python 等其他实现产生很大影响。
编辑 2012 年 9 月 19 日
关于 Jython,这是他们在文档中所说的:
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
然而,Python 确实定义了一个由 Jython 实现的模块导入锁。每当导入任何名称时都会获取此锁。无论导入是通过 import 语句、等效的
__import__
内置函数还是相关代码,都是如此。需要注意的是,即使相应的模块已经被导入,模块导入锁仍然会被获取,即使只是短暂的。
因此,在进行导入之前检查 sys.modules 以避免获取锁似乎是有意义的。你怎么看?