如何在Python中的多处理中更新全局计数器?

时间:2018-03-23 14:41:08

标签: python multithreading concurrency multiprocessing global-variables

我有一个用例,我同时运行两个while循环。这些循环引用一个全局的计数器变量。一个循环改变计数器变量,另一个循环根据计数器的当前值执行某个功能。如果我使用threading模块,这件事情很有用。但由于某些性能下降,我被迫使用multiprocessing

问题始于此。两个过程中的任何一个都保持全局变量不变。我知道这两个进程没有像线程一样的共享内存空间,因此它们的计数器值副本也不同。所以,我的问题是,如何在两个函数之间传递该全局变量,就像我能够使用线程一样。以下是用于说明我的问题的代码示例 -

import multiprocessing as mp

def work1():
    while True:
        global temp
        if temp==1:
           print("value is 1")
        else:
           print("value is not 1")

def work2():
    while True:
        global temp
        temp+=1
        time.sleep(5)
        temp-=1
        time.sleep(5)

if __name__=='__main__':
    global temp
    temp=0
    p1=mp.Process(target=work1)
    p2=mp.Process(target=work2)
    p1.start()
    p2.start()

如您所见,我希望process-2每5秒更新一次全局变量temp。并且,process-1应该打印全局变量temp的当前值。

我知道传递全局变量是一个非常糟糕的代码设计。所以,我在process-2中的文件中写入temp变量的值,并在process-1中连续读取它。由于文件关闭/打开操作太多,这是更糟糕的想法。

我想复制上面的功能,而不是读/写文件或使用全局变量(它不起作用)。请帮忙。

谢谢。

1 个答案:

答案 0 :(得分:1)

两个单独的进程不共享相同的全局变量,因此得到的结果。我认为这应该有助于找到一种在流程https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes

之间共享变量的方法