Python:在线程中安全读取对象值吗?

6 投票
5 回答
2933 浏览
提问于 2025-04-16 04:09

我有一个用Python和wxPython写的程序,程序的界面(GUI)是在主线程里运行的,而我用另一个线程来从文件中加载数据。有时候文件很大,加载起来比较慢,所以我用一个wxPulse对话框来显示进度。

在加载文件的过程中,我会在加载线程里统计已经读取的行数,然后在主线程的wxPulse对话框中显示这个数字。我是在主线程中读取一个变量,这个变量是加载线程在写的。

这样做算不算“线程安全”?会不会因此出现问题?我已经这样做了一段时间了,目前为止都没出什么问题。

顺便说一下,我知道可以用队列来传递这个计数,但我觉得麻烦,不想这么做,如果不必要的话。

5 个回答

2

这没问题,因为你只有一个写入线程。只进行读取的操作总是安全的。例外情况是,当你要读取多个相关的值,并且希望它们之间有某种一致性时。因为写入操作可以随时发生,所以同时读取多个值时,可能会出现不一致的情况,甚至可能根本没有合理的程序状态。在这种情况下,就需要使用锁来确保多个读取操作看起来像是一个单独的、独占的操作,这样就不会被写入操作打扰。

3

在普通的Python中,这种情况是安全的,因为所有对变量的访问都受到GIL(全局解释器锁)的保护。这意味着对变量的访问是同步的,也就是说一次只能有一个线程来操作这个变量。唯一的问题是,正如@Eloff提到的,如果你需要读取多个值并且希望它们保持一致,那么你就需要设计一些方法来控制访问。

8

一般来说,只要满足以下条件...

  • 你只有一个线程在写入数据,并且...
  • 显示的数值和实际计数不需要完全一致...

这样就没问题了。

撰写回答