2014-09-01 106 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