我有2个主题:
他们使用队列进行通信 - 当内容进入时,如果重要的话,工作人员将其放在队列中,并且经理将其关闭以进行处理。
但是,我希望经理也知道上次有什么事情发生 - 无论重要与否。
我的想法是工人可以设置一个整数(比方说),经理可以读取它。但似乎没有支持这种情况的线程原语。
管理员是否可以安全地读取工作人员的实例变量,只要它不写入?或者这会产生一些共享的内存问题?有没有办法在不将所有垃圾内容放入队列的情况下分享这种状态?
答案 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