问题:子进程全局变量没有按照预想的更新,致使数据没有写入磁盘。进程池必须在if __name__ == '__main__'
下面使用
复现:见实验代码
环境:centos7, python3.7
缘由: 子进程的__name__
属性值不是'__main__'
解决办法:须要用到的资源要在if __name__ == '__main__':
语句以前肯定好。在这语句以后的值不会传递到子进程里。html
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,)
输出:python
进程0: date的值: 初始日期 进程1: date的值: 初始日期
python的多进程在类Unix OS和Windows OS下的实现是不同的,前者可使用fork,然后者是python解释器新开一个进程,而后使用序列化须要用到的资源传到那个进程中,此时在子进程的那些模块下打印locals()
会显示里面的__name__
字段并非__main__
(个人显示的是_ua_main__
)。
另外若是运行python脚本的话,多进程必须在if __name__ == '__main__':
语句下才会执行,否则会报错。
另外,若是想在进程间通行,请使用官方的队列方法或者管道,由于全局变量在父进程和子进程之间的值是独立的,改变其中一个不会同步到另外的进程。centos
官网连接以下,里面对多进程的一些注意点和坑都说明的很清楚了:
https://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing#module-multiprocessingapp