如何在python中的线程之间共享一个整数

时间:2014-09-01 15:08:11

标签: python python-multithreading

我有2个主题:

  • 一个工作线程,循环查找来自ssh套接字的输入
  • 一个经理线程,负责处理来自工作线程的东西

他们使用队列进行通信 - 当内容进入时,如果重要的话,工作人员将其放在队列中,并且经理将其关闭以进行处理。

但是,我希望经理也知道上次有什么事情发生 - 无论重要与否。

我的想法是工人可以设置一个整数(比方说),经理可以读取它。但似乎没有支持这种情况的线程原语。

管理员是否可以安全地读取工作人员的实例变量,只要它不写入?或者这会产生一些共享的内存问题?有没有办法在不将所有垃圾内容放入队列的情况下分享这种状态?

1 个答案:

答案 0 :(得分:3)

  

管理员只需阅读工作人员的实例是否安全   变量,只要它不写入它们?

是的,这在CPython中是安全的。由于GIL,一个线程无法读取变量的值而另一个线程正在编写变量值。这是因为两个操作都是单字节码指令,这使得它们成为原子 - GIL将保留在整个指令中,因此没有其他线程可以同时执行。一个必须在另一个之前或之后发生。如果您有两个不同的线程尝试对同一个对象执行非原子操作(例如,递增整数),那么您只会遇到问题。如果是这种情况,您需要使用两个线程之间共享的threading.Lock()来同步对整数的访问。

请注意字节码的行为(甚至是GIL的存在)被视为实现细节,因此subject to change

  

CPython实现细节:Bytecode是一个实现细节   CPython翻译!不保证字节码不会   在Python版本之间添加,删除或更改。

因此,如果您希望在所有版本和Python的实现中绝对安全,请使用Lock,即使它现在实际上并不是必需的(实际上,可能会赢得'曾经在CPython中。

使用Lock来同步对变量的访问非常简单:

lock = threading.Lock()

主题1:

with lock:
   print(shared_int)  # Some read operation
# Lock is release once we leave the with block

主题2:

with lock:
   shared_int = 55 # Some write operation