2015-04-17 51 views
2

我有2個守護進程,它們應該訪問同一個變量。 我爲全局變量創建了第三個文件,每個守護進程都可以訪問該變量。但是當一個人改變這個變量時,另一個人仍然會看到默認值。多個文件中的Python全局變量

例如:

glob.py

time = 0 

守護程序:

import datetime 
import time 
import glob 

while(True): 
    glob.time = datetime.datetime.now() 
    time.sleep(30) 

守護B:

import glob 

while(True): 
    print(glob.time) 

將打印0每次 我希望我」 v e讓我的問題清晰明瞭,有人可以幫助我。 如果您需要更多信息,請隨時詢問。

+1

如果你的守護進程是進程,那麼他們有單獨的數據空間。如果它們是線程,它們共享相同的數據空間(變量)。請說明你如何創建/產生它們。 – Pynchia

+1

另外,你應該避免命名一個文件「glob」。py「,因爲它會影響到stdlib模塊」glob「 - 這可能會導致意外的錯誤 – jsbueno

+0

如果你使用的是'threading',這將按預期工作,所以我假定你正在使用'multiprocessing'。 [在進程之間共享狀態](https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes)。 –

回答

2

它看起來像(雖然你沒有明確地說)你正在以一種完全獨立的方式運行你的程序:兩種不同的Python解釋器調用。如果你有兩個相同的程序正在運行,每個程序都有它的變量實例(全局的或其他的),就沒有這樣的魔法了。

如果您正在執行一些簡單的任務,更簡單的方法是爲每個進程輸出一個文本文件作爲輸出,另一個進程試圖從每個想要了解的進程生成的文件中讀取信息 - (你甚至可以在Unix中使用命名管道)。

另一種方法是使用Python腳本來協調使用stdlib模塊的multiprocessing stdlib模塊啓動守護進程,然後創建multiprocessing.Manager對象以直接在進程之間共享變量。 開始時可能會更復雜,但這是乾淨的事情。在這裏檢查Manager類文檔: https://docs.python.org/3/library/multiprocessing.html

2

How do I share global variables across modules?

到一個程序中共享跨模塊信息的正規的方法是創建一個特殊的模塊(通常稱爲配置或CFG)。只需在應用程序的所有模塊中導入配置模塊;該模塊將成爲全球名稱。因爲每個模塊只有一個實例,對模塊對象所做的任何更改都會處處體現:

import time 
import glb 

while(True): 
    glb.t += 1 
    time.sleep(3) 
    print glb.t 

b.py:

import glb 
import a 
while(True): 
    print(glb.t) 

glb.py:

t = 0 

啓動a.py後輸出:

python b.py 
1 
2 
3 
4 
5 
6 
+0

是的 - 這看起來像OP試圖做的 - 但它看起來像其他模塊正在作爲獨立的進程運行(我猜他從他命名爲「守護進程」) – jsbueno

+0

@jsbueno,基於標題和OP的代碼看起來像我會留下答案,這是正確的如何在多個文件中使用全局變量 –

+0

我沒有要求你刪除答案,它看起來不是OP所需要的正確的東西 - 但它可能是(也可能是)案件爲其他人打這個問題。 – jsbueno