python多进程,全局变量未更新问题

发布时间:2019-10-10 09:16:48编辑:auto阅读(2101)

    python多进程,全局变量未更新

    问题:子进程全局变量没有按照预想的更新,导致数据没有写入磁盘。进程池必须在if __name__ == '__main__'下面使用
    复现:见实验代码
    环境:centos7, python3.7
    原因: 子进程的__name__属性值不是'__main__'
    解决办法:需要用到的资源要在if __name__ == '__main__':语句之前确定好。在这语句之后的值不会传递到子进程里。

    代码

    from multiprocessing import Pool
    
    date = '初始日期'
    def foo():
    ​    print(f'date的值: {date}')
    
    if __name__ == '__main__':
    ​    date = '覆盖初始日期'
    
    ​    # 多进程,全部不能覆盖
    ​    with Pool(2) as mypool:
    ​        for i in range(2):
    ​            print(f'进程{i}:')
    ​            mypool.apply(foo,)

    输出:

    进程0:
    date的值: 初始日期
    进程1:
    date的值: 初始日期

    总结

    python的多进程在类Unix OS和Windows OS下的实现是不一样的,前者可以使用fork,而后者是python解释器新开一个进程,然后使用序列化需要用到的资源传到那个进程中,此时在子进程的那些模块下打印locals()会显示里面的__name__字段并不是__main__(我的显示的是_ua_main__)。
    另外如果运行python脚本的话,多进程必须在if __name__ == '__main__':语句下才会执行,不然会报错。
    另外,如果想在进程间通行,请使用官方的队列方法或者管道,因为全局变量在父进程和子进程之间的值是独立的,改变其中一个不会同步到另外的进程。

    官网链接如下,里面对多进程的一些注意点和坑都说明的很清楚了:
    https://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing#module-multiprocessing

关键字