2016-08-22 113 views
0

我正在嘗試訪問正在不斷更新的變量,在while循環中不同的文件中。這裏是我用於測試的代碼:如何訪問正在while循環中更新的變量

# file1  
import time 
x = 0 
while True: 
    x += 1 
    time.sleep(2.0) 

# file2 
from file1 import x 
print x 

當我運行file2時,它從頭開始while循環。我想訪問x的一個實例。例如,如果x = 10,我想要file2打印10.這可能嗎?

+2

除非您明確創建多個線程或進程,否則Python程序將只有一個執行線程。在你的例子中,解釋器將開始執行file2並進入import語句。現在執行將移至file1,導入'time'模塊並打開while循環。這是一個無限循環,所以它不會完成,並且不會再有file2中的其他語句。 –

+1

這是可能的,但不使用導入系統。導入必須等到該過程完成(在模塊範圍內將永遠掛起該無限循環)。您必須將其寫出到數據庫或文件並從那裏加載。 –

回答

1

您可以嘗試以下操作。首先,因爲存在無限循環,所以導入file1將會阻塞,所以您應該在一個線程中運行循環。其次,你可以包裝在一個列表遞增的整數(或任何其他類型的對象),所以你可以使用參考其當前值(否則你將被導入值不是一個引用):

# file1  
import time 
import threading 

x = [0] 

def update_var(var): 
    while True: 
     var[0] += 1 
     time.sleep(2.0) 

threading.Thread(target=update_var, args=(x,)).start() 

# file2 
from file1 import x 
print x[0] 
2

我不太清楚你的意思。您是否想要f​​ile1運行,並且無限期地每2秒遞增一次「x」的值,並且在任何時候運行file2時,都會從運行「file1」的程序/ python實例中提取當前值「x」 ?

如果是這樣,這不是你將如何處理它。使用file2,您將從file1中提取set變量x = 0。你需要做的是具有某種形式的IPC(進程間通信),以便file2可以從file1訪問「x」的值。你可以通過多種方式做到這一點,包括共享內存,Redis或Memcached之類的鍵/值存儲程序,數據庫等。

如果你想通過redis或memcached來做,只需運行redis,使用Python的redis庫,並且每2秒調用一次密鑰「x」的.incr方法。然後,當您運行file2時,調用.get方法獲得鍵「x」,您將獲得當前值。當file1運行時,它將繼續增加x;當它不是時,它不會並且將有效地凍結。但是,redis會將內存中最後一個已知值保留爲「x」鍵。

要做到這一點與數據庫,你可以實現一個MySQL數據庫/表,並每2秒增加一個表中的鍵列中的「x」的值。你必須看看Python的mySQL庫。

要做到這一點與共享內存,看看Python的共享內存功能。

還有很多其他的方式來共享數據。您可以簡單地通過打開它,寫入新值,刷新並關閉它,每2秒將「x」的值寫入文件。然後簡單地讓file2讀取該文件。當然,這樣你就會遇到競爭條件問題,它在更新文件之前讀取文件並獲得一個陳舊值,這些都取決於該文件在那個時候從該進程寫入該文件的優先級。

+0

我認爲OP可能只是想使用線程,但從問題中不清楚。 –

+0

我也這麼想,但如果不是,他想要使用兩個獨立的進程,我會說這些是一些很好的方法。根據他需要做什麼,文件方法可以工作,但在我的情況下,我會使用redis來幫助原子性 – Brendan

+0

感謝您的徹底迴應。我將使用線程,但你的答案教會了我很多。再次感謝。 – Jakub