2017-07-18 35 views
0

我试图在一个进程中设置一个全局变量,并从另一个进程读取它。 这基本上是我在做什么:从不同的函数调用时,全局变量有不同的值

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每五秒钟
  • 每一秒FUNC2提高了全局变量“火箭”读取全局变量火箭并打印
  • 这两种方法运行parralel直到“火箭” == 10

所以期望输出应该是这样的:

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

我声明'火箭'作为func1的全局变量as you should

我在这里失踪了什么?

+0

的可能的复制[Python的多处理全局变量的更新不会返回到父(HTTPS: //stackoverflow.com/questions/11055303/python-multiprocessing-global-variable-updates-not-returned-to-parent) –

回答

0

你可以尝试设置全局火箭= 0,删除该行 rocket = 0

0

我终于得到它!

您不能按照我的意图使用全局变量。

而是使用队列在进程之间交换数据。

The docu has an example on this.

所以,你可以做这样的事情:

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 
相关问题