返回顶部
首页 > 资讯 > 后端开发 > Python >python多进程,全局变量未更新问题
  • 164
分享到

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

进程全局变量python 2023-01-31 08:01:16 164人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

问题:子进程全局变量没有按照预想的更新,导致数据没有写入磁盘。进程池必须在if __name__ == '__main__'下面使用复现:见实验代码环境:Centos7, python3.7原因: 子进程的__name__属性值不是'_

问题:子进程全局变量没有按照预想的更新,导致数据没有写入磁盘。进程池必须在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

--结束END--

本文标题: python多进程,全局变量未更新问题

本文链接: https://lsjlt.com/news/193187.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作