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

31次阅读

共计 853 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0