我用python编写了一个可以同时运行2个进程的程序,但是我想在第一个进程的中间将一个变量带到另一个进程,就像将该变量从一个函数传递到另一个函数一样。这是一个正在工作的代码,但是输出不是我期望的。
import multiprocessing
import time
t=0
def countup():
global t
while t<25:
t=t+1
time.sleep(1)
print("count",t)
def what():
global t
globals().update()
while True:
time.sleep(3)
print ("the count reached ",t)
if __name__=="__main__":
p1 = multiprocessing.Process(target=countup,args=())
p2 = multiprocessing.Process(target=what, args=())
p1.start()
p2.start()
p1.join()
p2.join()
输出显示如下
count 1
count 2
the count reached 0
count 3
count 4
count 5
the count reached 0
count 6
count 7
count 8
the count reached 0
...
变量“ t”没有更新,但是两个进程同时工作。预期结果应该是这样的:
count 1
count 2
the count reached 2
count 3
count 4
count 5
the count reached 5
count 6
count 7
count 8
the count reached 6
...
我想念什么吗?我的代码有问题吗?
答案 0 :(得分:0)
我解决了这个问题,使用队列或管道交换变量是关键。
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get()) # prints "[42, None, 'hello']"
p.join()
使我惊奇的是,我使用这种方法在两个同时工作的不同进程之间进行同步计数打印。 ...哇!
代码如下:
import multiprocessing
from multiprocessing import Process,Queue
import time
t=0
def countup(q):
global t
while t<25:
t=t+1
time.sleep(1)
print("count",t)
q.put(t)
if __name__=="__main__":
q = Queue()
p = multiprocessing.Process(target=countup,args=(q,))
p.start()
while (q.get()<15):
time.sleep(2)
print("the count reached ",q.get())
p.join()
结果就是这个
count 1
count 2
the count reached 2
count 3
count 4
count 5
the count reached 4
count 6
the count reached 6
count 7
count 8
...