2010-09-15 140 views
4

我有一个Python/wxPython程序,其中GUI是主线程,我使用另一个线程从文件加载数据。有时这些文件很大并且加载速度很慢,所以我使用wxPulse对话框来指示进度。Python:安全地读取线程中的对象的值?

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

这是“线程安全”吗?这可能会导致问题吗?我已经做了一段时间,迄今为止一直很好。

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

+0

使用[queue](http://docs.python.org/library/queue.html),它们非常容易使用。 – Seth 2010-09-15 04:19:29

+0

@Seth:我已经使用队列处理其他事情,并且认同他们很容易处理。看起来我并不需要一个队列来处理这种特殊情况,因此最好不要将代码与不需要的功能混淆起来。 – 2010-09-15 19:56:19

+0

大家好:感谢各位的好评。太糟糕了,我只能挑一个。 – 2010-09-15 19:56:48

回答

5

一般只要...

  • 你只能有一个线程写入它,并...
  • 这不是重要的是,计数准确与显示值同步保持..

这很好。

1

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

0

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

1

这是相当安全的。

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

没有舞台count是指比“N对象”或“N + 1个对象”

2

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