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

时间:2010-09-15 04:12:18

标签: python thread-safety

我有一个Python / wxPython程序,其中GUI是主线程,我使用另一个线程从文件加载数据。有时文件很大且加载缓慢,所以我使用wxPulse对话框来指示进度。

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

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

PS。我知道我可以使用队列来传输计数,但是我很懒,如果不需要我也不想。

5 个答案:

答案 0 :(得分:5)

一般只要......

  • 你只有一个帖子写给它,而且......
  • 计数与显示值保持精确同步并不重要......

没关系。

答案 1 :(得分:2)

在普通的python中,这将是安全的,因为所有对变量的访问都受到GIL(全局解释器锁)的保护,这意味着对变量的所有访问都是同步的,因此一次只有一个线程可以执行此操作。唯一的问题是@Eloff指出,如果你需要读取多个值并且需要它们保持一致 - 在这种情况下你需要设计一些访问控制。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这很安全。

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

没有阶段计数指的是“n对象”或“n + 1对象”以外的东西

答案 4 :(得分:0)

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