从不同函数

时间:2017-07-18 15:27:41

标签: python global-variables

我正在尝试在一个进程中设置一个全局变量,并从另一个进程中读取它。 这基本上就是我在做的事情:

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每五秒钟将全局变量'rockets'增加1
  • 每秒func2读取全局变量火箭并打印它
  • 两种方法运行parralel直到'rockets'== 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

中将'火箭'声明为全局变量

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

您可以尝试设置global rocket = 0并删除该行 rocket = 0

答案 1 :(得分: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