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

如何在python中的线程之间共享整数,python,python-multithreading,Python,Python Multithreading,我有两个线程: 一个工作线程,循环查找来自ssh套接字的输入 一个管理线程,处理来自工作线程的内容 他们使用一个队列进行通信——当有东西进来时,工作人员会将它放在队列中,如果它很重要,经理会将它取下进行处理 然而,我想让经理也知道最后一次有什么事情发生——不管是重要的还是不重要的 我的想法是,工人可以设置一个整数,经理可以读取它。但似乎没有一个线程原语支持这一点 如果不向worker实例变量写入数据,那么管理员只读取worker实例变量是否安全?还是会出现一些共享内存问题?有没有什么方法可以

我有两个线程:

  • 一个工作线程,循环查找来自ssh套接字的输入
  • 一个管理线程,处理来自工作线程的内容
他们使用一个队列进行通信——当有东西进来时,工作人员会将它放在队列中,如果它很重要,经理会将它取下进行处理

然而,我想让经理也知道最后一次有什么事情发生——不管是重要的还是不重要的

我的想法是,工人可以设置一个整数,经理可以读取它。但似乎没有一个线程原语支持这一点

如果不向worker实例变量写入数据,那么管理员只读取worker实例变量是否安全?还是会出现一些共享内存问题?有没有什么方法可以让我在不排队的情况下分享这种状态

经理只读取工作人员的实例是否安全 变量,前提是它不写入它们

是的,这在CPython是安全的。由于,一个线程不可能在另一个线程写入变量的过程中读取变量的值。这是因为这两个操作都是一条字节码指令,这使它们具有原子性——GIL将保留整个指令,因此其他线程不能同时执行。一个必须在另一个之前或之后发生。只有当两个不同的线程试图对同一个对象执行非原子操作(例如递增整数)时,才会遇到问题。如果是这种情况,则需要使用两个线程之间共享的一个线程来同步对整数的访问

请注意,字节码的行为(甚至GIL的存在)被视为一个实现细节,因此:

CPython实现细节:字节码是 CPython解释器!不保证字节码不会被删除 可以在Python版本之间添加、删除或更改

因此,如果您希望在所有版本和实现的Python中都绝对安全,请使用
,即使它现在在CPython中实际上并不需要(实际上,可能永远也不需要)

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

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