Python:从线程中的对象读取值是否安全?

Python:从线程中的对象读取值是否安全?,python,thread-safety,Python,Thread Safety,我有一个Python/wxPython程序,其中GUI是主线程,我使用另一个线程从文件加载数据。有时文件很大,加载速度很慢,所以我使用wxPulse对话框来指示进度 加载文件时,我计算计数线程中已读取的行数,并在主线程的wxPulse对话框中显示此计数。我通过读取加载线程正在写入的同一个变量来获取主线程中的计数 这是“线程安全”吗?这会不会造成问题?我已经做了一段时间了,到目前为止还不错 另外,我知道我可以使用队列来传输计数,但我很懒,如果不需要的话,我也不想这样做。通常只要 你只有一个线程在

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

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

这是“线程安全”吗?这会不会造成问题?我已经做了一段时间了,到目前为止还不错


另外,我知道我可以使用队列来传输计数,但我很懒,如果不需要的话,我也不想这样做。

通常只要

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

很好。

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

这是安全的,因为它不是特别关键。奇怪的事情,比如值在应该更新的时候不更新,都无关紧要。当你假设正在读写的单个int是“原子的”时,很难得到一个明确的答案,因为它取决于确切的体系结构和一系列其他东西。但它不会比有时打错电话更糟糕,所以继续吧。。。或者使用队列。:)

非常安全

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


在普通python中,count所指的不是“n对象”或“n+1对象”

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

使用a,它们非常容易使用。@Seth:我使用队列处理其他事情,并且同意它们很容易使用。看起来在这种特殊情况下我不需要队列,因此最好不要用不需要的功能将代码弄得乱七八糟。可惜我只能挑一个。