2017-03-02 174 views
0

以下代碼是否正確? (它初始化一個在其構造函數中啓動一個線程的對象來改變它的狀態)。在線程之間共享類屬性

import threading 
import time 

class Test(): 

    def __init__(self): 

     self.a = False 

     def workload(): 
     self.a = True    

     self.thread = threading.Thread(target = workload) 
     self.thread.start() 

    def display(self): 
     print self.a 

test = Test() 

while True: 
    test.display() 
    time.sleep(0.1) 

它輸出但我有一個更復雜的測試情況下(即不能輕易地在這裏重現),其中工作量確實要複雜得多的東西(包括睡覺,從管理者隊列中檢索項目),並在那裏程序不會輸出真正的 - 雖然self.a的值在工作負載函數內發生了變化。 Python是否會在主線程和子線程之間創建共享值的臨時副本,並定期「同步」,或者問題出在別處?

回答

0

__main__進程和線程def workload似乎使用相同的對象。
我在self.a = True之前添加了time.sleep(0.1)以給出__main__過程有機會顯示虛假
我收到以下輸出:

Start __main__ 
<__main__.Workload object at 0xf7027fac> <function Workload.__init__.<locals>.workload at 0xf7017c44> 
False 
<__main__.Workload object at 0xf7027fac> <function Workload.__init__.<locals>.workload at 0xf7017c44> 
False 
True 
True 
True 
EXIT __main__