首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python多进程,全局变量未更新问题

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

作者头像
py3study
发布2020-01-02 15:25:56
发布2020-01-02 15:25:56
3.3K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

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

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

代码

代码语言:javascript
代码运行次数:0
运行
复制
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,)

输出:

代码语言:javascript
代码运行次数:0
运行
复制
进程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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python多进程,全局变量未更新
    • 代码
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档