2017-09-13 70 views
0

我從API獲取兩個數據流,所以有三個線程,main,stream1和stream2。 Stream1和Stream2需要處理這些數據,一旦完成,它們將存儲在main_value1和main_value2上。在多線程中讀取一個變量

從主線程我需要讀取任何給定時間的最後一個值(所以如果我需要這個值,它仍然處理,然後我得到最後處理/存儲一個),什麼是最佳的方式?從這裏的代碼示例中,我需要幫助編碼功能get_main_value1(),當然,get_main_value2()

def stream1(): 
    while True: 
     main_value1 = process() 
def stream2(): 
    while True: 
     main_value2 = process2() 
def get_main_value1(): ? 
def get main_value2(): ? 
def main(): 
    threading.Thread(function=stream1,).start() 
    threading.Thread(function=stream2).start() 
    while True: 
     time.sleep(random.randint(0,10)) 
     A = get_main_value1() 
     B = get_main_value2() 

回答

0

一個辦法是讓他們全球:

STREAM1_LAST_VALUE = None 
def stream1(): 
    global STREAM1_LAST_VALUE 
    while True: 
     main_value1 = process() 
     STREAM1_LAST_VALUE = main_value1 

STREAM2_LAST_VALUE = None 
def stream2(): 
    global STREAM2_LAST_VALUE 
    while True: 
     main_value2 = process2() 
     STREAM2_LAST_VALUE = main_value2 

def get_main_value1(): 
    return STREAM1_LAST_VALUE 

def get main_value2(): 
    return STREAM2_LAST_VALUE 

def main(): 
    threading.Thread(function=stream1,).start() 
    threading.Thread(function=stream2).start() 
    while True: 
     time.sleep(random.randint(0,10)) 
     A = get_main_value1() 
     B = get_main_value2() 
+0

也許這是一個愚蠢的問題:如果我在通過函數設置時需要這個值,該怎麼辦?會發生什麼,或者這是不可能發生的? –

+0

@FroidDymylja我不知道我明白。如果你看我的代碼'process2()'返回一個值,然後覆蓋'STREAM2_LAST_VALUE'。因此沒有中間狀態是可能的。 'process2()'也總是看到最後一個值,所以它可以安全地使用它。如果您直接更新到'STREAM2_LAST_VALUE'對象,則可能會出現不一致。 Python中保證了簡單讀寫的一致性。 – freakish

+0

_「在Python中保證簡單讀寫的一致性」_?你能提供一個鏈接來閱讀這個。 – stovfl