在多进程Pool()中使用Lock()是没有用的吗?

时间:2019-12-26 09:03:11

标签: multiprocessing global-variables python-3.6 pool

在我的python3多进程程序中,我需要一个全局变量COUNT进行计数。我使用Manager.Lock()维护全局变量COUNT,以防止在子进程写入此变量时发生冲突。
以下是我的代码实现;

# Ubuntu 16.04 LTS, python 3.6
from multiprocessing import Pool, Lock, Manager
COUNT = 0
def f(lock,x):
    global COUNT
    with lock:
        COUNT += x
        print(COUNT,end=' ')

if __name__ == '__main__':
    manager = Manager()
    lock = manager.Lock()
    print('Origin COUNT:',COUNT)
    print('COUNT in child-process:',end=' ')
    with Pool(4) as pool:
        for i in [2,4,6,8,10]:
            pool.apply(func=f,args=(lock,i))
        pool.close()
        pool.join()
        print()
        print('Final COUNT:',COUNT)

# result
Origin COUNT: 0
COUNT in child-process: 6 4 8 2 12 
Final COUNT: 0

很明显:

  1. 子进程在相同的变量COUNT上运行。
  2. 每个子进程对全局变量COUNT的操作未全部保存。(为什么?)

最终COUNT为0 ???结果不应该是30吗? (sum([2,4,6,8,10])
这真的让我感到困惑。 Lock()失败?

0 个答案:

没有答案