【问题标题】:How to share an integer between threads in python如何在python中的线程之间共享整数
【发布时间】:2014-09-01 15:08:11
【问题描述】:

我有 2 个线程:

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

他们使用队列进行通信——当有东西进来时,工作人员将它放在队列中(如果重要),然后经理将其取出来处理。

但是,我希望经理也知道上次有什么东西进来的时间 - 无论是否重要。

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

如果经理不向他们写入,只读取工人的实例变量是否安全?或者这会带来一些共享内存问题吗?有没有什么方法可以让我分享这个状态而不把所有的垃圾都放到队列中?

【问题讨论】:

    标签: python python-multithreading


    【解决方案1】:

    经理只读取工人的实例是否安全 变量,只要它不写入它们?

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

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

    CPython 实现细节:字节码是一个实现细节 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      相关资源
      最近更新 更多