【问题标题】:python threading: memory model and visibilitypython线程:内存模型和可见性
【发布时间】:2010-08-23 16:57:47
【问题描述】:

python 线程是否像 Java 那样暴露内存可见性和语句重新排序的问题?由于我找不到对“Python 内存模型”或类似内容的任何引用,尽管事实上很多人都在编写多线程 Python 代码,我猜这些陷阱在这里不存在。例如,没有 volatile 关键字。但似乎并没有在任何地方明确说明,例如,一个线程中的变量更改对所有其他线程立即可见。

也许这些东西对 Python 程序员来说都是非常明显的,但作为一个可怕的 Java 程序员,我需要一点额外的保证:)

【问题讨论】:

    标签: python multithreading memory-model


    【解决方案1】:

    Python 的线程没有正式的模型(嘿,毕竟,多年来一直没有一个用于 Java 的模型……希望最终也会为 Python 编写一个模型)。

    实际上,没有任何 Python 实现执行任何高级优化,例如语句重新排序或临时将共享变量视为线程本地变量 - 即使它们没有正式保证,您也可以依赖这些语义约束。

    特别是 CPython,正如 @Rawheiser 所提到的,它使用全局解释器锁;其他实现(PyPy、IronPython、Jython 等)没有(因此它们可以通过线程模型有效地使用多个内核,而 CPython 需要多处理来实现相同的目的),所以如果你想要的话,你不应该指望它编写可在整个 Python 实现中移植的代码。 (因此,您不应该指望由于 GIL 而在 CPython 中恰好是原子的操作的“原子性”,例如字典访问——在其他 Python 实现中,多个线程可能同时修改一个字典并导致除非你用锁或类似的东西保护字典)。

    【讨论】:

    • 即使在 CPython 中,字典访问也不是在所有情况下都是原子的。如果键的哈希/比较函数是用 Python 编写的,则在执行这些函数时,GIL 将在操作码之间临时释放。 (您可能已经知道这一点,但我认为值得向其他读者指出)
    • 谢谢!我整个上午都在学习 GIL。显然,(C)Python 编程将涉及一种不同于我习惯的看待线程的方式。 @Daniel Stutzbach:我是 Python 新手,会忽略这个事实。谢谢。
    • @philo,总结了 CPython 的多任务处理情况:只有当您有 I/O 等待(您可以委托给线程)或在线程安全中执行繁重的操作时,线程才会为您提供帮助Python 扩展(如numpy)。如果您的目的是为 Python 编码的 CPU 绑定操作使用多个内核,请使用 multiprocessing 而不是 threading
    • @AlexMartelli 你的回答还有效吗?
    猜你喜欢
    • 2011-11-19
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多