2017-07-18 8 views
0

グローバル変数を1つのプロセスに設定し、別のプロセスから読み込もうとしています。 は、これは私がやっているものを基本的には次のとおりです。グローバル変数は、別の関数から呼び出されたときに値が異なります

私はこのコードがやるべきことだと思う何
from multiprocessing import Process 
import time 

rocket = 0 

def func1(): 
    global rocket 
    while rocket < 10: 
     rocket += 1 
     print("Func1: " + str(rocket)) 
     time.sleep(5) 

def func2(): 
    while rocket < 10: 
     print ("Func2: " + str(rocket)) 
     time.sleep(1) 

if __name__=='__main__': 
    p1 = Process(target = func1) 
    p1.start() 
    p2 = Process(target = func2) 
    p2.start() 

  • func1のは1、5秒ごと
  • 毎秒func2のことで、グローバル変数「ロケット」を高めますグローバル変数ロケットを読み込み、2つの方法が「ロケット」== 10
までparralelを実行
  • 、それを印刷します3210

    だから、期待される出力のようなものでなければなりません:

    Func1: 1 
    Func2: 1 
    Func2: 1 
    Func2: 1 
    Func2: 1 
    Func2: 1 
    Func1: 2 
    Func2: 2 
    Func2: 2 
    #... and so on 
    

    しかし、実際の出力のような行く:

    Func1: 1 
    Func2: 0 
    Func2: 0 
    Func2: 0 
    Func2: 0 
    Func2: 0 
    Func1: 2 
    Func2: 0 
    Func2: 0 
    #... and so on 
    

    func2の 'ロケット' から印刷する場合は、必ず0

    ままI 'は宣言していますfunc1のグローバル変数としてのロケット 'as you should

    私はここで何が欠けていますか?

  • +0

    の可能性のある重複した[グローバル変数の更新をマルチプロセッシングPythonの親に戻っていない](HTTPS

    The docu has an example on this.

    は、だから、このような何かを行うことができます。 //stackoverflow.com/questions/11055303/python-multiprocessing-global-variable-updates-not-returned-to-parent) –

    答えて

    0

    あなたは試してみて、= 0をグローバルなロケットを設定し、私は最終的にそれを得た rocket = 0

    0

    行を削除することができます!

    グローバル変数は、意図したとおりに使用することはできません。

    代わりに、キューを使用してプロセス間でデータを交換します。

    from multiprocessing import Process, Queue 
    import time 
    
    def func1(q): 
        q.put("FirstValue") 
        time.sleep(10) 
        q.put("SecondValue") 
    
    
    def func2(q): 
        time.sleep(5) 
        print ("Func2: " + str(q.get())) 
        time.sleep(15) 
        print ("Func2: " + str(q.get())) 
    
    
    if __name__=='__main__': 
        q = Queue() 
    
        p1 = Process(target = func1, args=(q,)) 
        p1.start() 
        p2 = Process(target = func2, args=(q,)) 
        p2.start() 
    

    出力します:

    Func2: FirstValue 
    Func2: SecondValue 
    
    関連する問題