我正在尝试在一个进程中设置一个全局变量并从另一个进程中读取它。 这基本上是我正在做的:
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 中的全局变量,您应该这样做
我在这里错过了什么?
您可以尝试设置全局火箭 = 0 并删除该行rocket = 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