如何在流程中间将变量提取到另一个流程多处理python

时间:2018-11-19 22:02:54

标签: python multithreading multiprocessing

我用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
...
我想念什么吗?我的代码有问题吗?

1 个答案:

答案 0 :(得分:0)

根据#deets的说明,

我解决了这个问题,使用队列或管道交换变量是关键。

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
...