2014-09-01 89 views
2

我有2个线程的线程之间的整数:如何分享蟒蛇

  • 工作线程,该回路从ssh插座
  • 经理线程寻找输入,从处理的东西工作者线程

他们使用队列进行通信 - 随着东西进入,工作人员将它放在队列中(如果它很重要),并且管理器将其关闭进行处理。

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

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

管理员只要读取工作人员的实例变量,只要它不写入他们是否安全?或者这会给一些共享内存问题?有什么方法可以在不将所有垃圾东西放入队列的情况下共享此状态?

回答

3

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

是的,这在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