代码之家  ›  专栏  ›  技术社区  ›  minou

python:可以安全地从线程中的对象读取值吗?

  •  4
  • minou  · 技术社区  · 14 年前

    我有一个python/wxpython程序,其中gui是主线程,我使用另一个线程从文件加载数据。有时文件很大,加载速度很慢,所以我使用wxpulse对话框来指示进度。

    加载文件时,我计算计数线程中已读取的行数,并在主线程的wxpulse对话框中显示此计数。我通过读取加载线程正在写入的同一个变量来获取主线程中的计数。

    这是“线程安全”吗?这会导致问题吗?我已经做了一段时间了,到目前为止一切都很好。

    我知道我可以用一个队列来传递计数,但是我很懒惰,如果不需要的话,我不想这样做。

    5 回复  |  直到 14 年前
        1
  •  5
  •   Amber    14 年前

    一般只要…

    • 你只有一条线在写,而且…
    • 计数与显示值精确同步并不重要…

    很好。

        2
  •  2
  •   mmmmmm    14 年前

    在正常的python中,这是安全的,因为对变量的所有访问都受gil(全局解释器锁)保护,这意味着对变量的所有访问都是同步的,因此一次只能有一个线程这样做。唯一的问题是@eloff指出,如果您需要读取多个值并需要它们保持一致,那么在这种情况下,您需要设计一些访问控制。

        3
  •  1
  •   Eloff    14 年前

    这很好,因为您只有一个编写线程。只读操作始终是线程安全的。当您读取多个相关值并期望它们之间有某种形式的一致性时,就会出现这种情况的例外。因为写入可以在任何时候发生,所以对多个值的读取可能不一致,甚至可能根本没有任何合理的程序状态。在这种情况下,锁用于使多个读取看起来像是一个单独的原子操作,不包括任何写入操作。

        4
  •  1
  •   John La Rooy    14 年前

    很安全。

    当计数从n增加到n+1时,创建“n+1对象”,然后计数从引用“n对象”切换到新的“n+1对象”。

    没有阶段计数是指除“n对象”或“n+1对象”之外的其他对象。

        5
  •  0
  •   Scott Stafford    14 年前

    它是安全的,因为它不是特别重要。奇怪的事情,比如价值不更新,什么时候应该不重要。当你假装一个正在被读取和写入的整数是“原子的”时,很难得到一个明确的答案,因为它依赖于精确的体系结构和其他一些东西。但有时它不会做比给出错误数字更糟糕的事情,所以继续……或者使用队列。:)