资讯专栏INFORMATION COLUMN

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

AlphaGooo / 1221人阅读

摘要:多进程,全局变量未更新问题子进程全局变量没有按照预想的更新,导致数据没有写入磁盘。另外,如果想在进程间通行,请使用官方的队列方法或者管道,因为全局变量在父进程和子进程之间的值是独立的,改变其中一个不会同步到另外的进程。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43382.html

相关文章

  • Python_系统编程

    摘要:主进程会等待所有的子进程先结束,然后再结束主进程。关闭进程池,关闭后实例不再接收新的请求等待实例中的所有子进程执行完毕,主进程才会退出,必须放在语句之后。主进程一般都用来等待,任务在子进程中执行。 多任务:同一个时间段中,执行多个函数/运行多个程序. 操作系统可以同时运行多个任务:操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,...

    wuaiqiu 评论0 收藏0
  • Python 面试」第三次更新

    摘要:说一下进程线程以及多任务多进程多线程和协程进程概念一个程序对应一个进程,这个进程被叫做主进程,而一个主进程下面还有许多子进程。避免了由于系统在处理多进程或者多线程时,切换任务时需要的等待时间。 showImg(https://segmentfault.com/img/bVbuYxg?w=3484&h=2480); 阅读本文大约需要 10 分钟。 14.说一下进程、线程、以及多任务(多进...

    wslongchen 评论0 收藏0
  • Python 面试」第四次更新

    摘要:解决的办法在处理计算密集型任务时,使用多进程协程,发挥计算机多核的威力,而处理密集型,则可以使用多线程。至此,有关知识点的面试题就已告一段落,下次更新数据库,方面面试题。 showImg(https://segmentfault.com/img/bVbuYzy?w=3484&h=2480); 阅读本文大约需要 5 分钟。 15.说一说 GIL 前面有提到由于 Python 基于 C 语...

    hellowoody 评论0 收藏0
  • 精选50道Python面试题,快来看看你经掌握了少道吧

    摘要:从存储的字符串表示中检索原始对象的过程称为。这称为命名空间。如果需要八进制或十六进制表示,请使用内置函数或。和有什么区别返回对象,而返回列表,并使用相同的内存,无论范围大小是多少。它提供了灵活性,并允许开发人员为他们的项目使用正确的工具。 ...

    zzir 评论0 收藏0
  • python进阶笔记【1】--- 进程

    摘要:很简单,这个模块实现了开辟一块共享内存空间,就好比中的方法一样,有兴趣的同学可以去查阅。查了下资料,返回的对象控制了一个进程,可用于多进程之间的安全通信,其支持的类型有和等。 有关于 multiprocessing 中共享变量的问题 现在的cpu都很强大,比方我用的至强2620有24核可以同时工作,并行执行进程程序。这在计算密集型的程序是很需要的,如沙漠中的绿洲,令人重获新生。那么,问...

    Wildcard 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<