Python多进程共享变量实现方法(1)

声明一个全局变量

share_var = [“start flag”]

def sub_process(process_name):

企图像单个进程那样通过global声明使用全局变量

global share_var

share_var.append(process_name)

但是很可惜,在多进程中这样引用只能读,修改其他进程不会同步改变

for item in share_var:

print(f"{process_name}-{item}")

pass

def main_process():

process_list = []

创建进程1

process_name = “process 1”

tmp_process = multiprocessing.Process(target=sub_process,args=(process_name,))

process_list.append(tmp_process)

创建进程2

process_name = “process 2”

tmp_process = multiprocessing.Process(target=sub_process, args=(process_name,))

process_list.append(tmp_process)

启动所有进程

for process in process_list:

process.start()

for process in process_list:

process.join()

if name == “main”:

main_process()

执行结果如下,可以看到进程1中的修改未表现在进程2中(不过要注意,和多线程一样,如果运算量再大一点进程1并不一定比进程2先执行):

在这里插入图片描述

二、共享普通类型变量实现方法

import multiprocessing

不能将共享变量和共享锁定义成全局变量然后通过global引用那样会报错,只能传过来

def sub_process(process_name,share_var,share_lock):

获取锁

share_lock.acquire()

share_var.append(process_name)

释放锁

share_lock.release()

for item in share_var:

print(f"{process_name}-{item}")

pass

def main_process():

单个值声明方式。typecode是进制类型,C写法和Python写法都可以,见下方表格;value是初始值。

这种单值形式取值赋值需要通过get()/set()方法进行,不能直接如一般变量那样取值赋值

share_var = multiprocessing.Manager().Value(typecode, value)

数组声明方式。typecode是数组变量中的变量类型,sequence是数组初始值

share_var = multiprocessing.Manager().Array(typecode, sequence)

字典声明方式

share_var = multiprocessing.Manager().dict()

列表声明方式

share_var = multiprocessing.Manager().list()

share_var.append(“start flag”)

声明一个进程级共享锁

不要给多进程传threading.Lock()或者queue.Queue()等使用线程锁的变量,得用其进程级相对应的类

不然会报如“TypeError: can’t pickle _thread.lock objects”之类的报错

share_lock = multiprocessing.Manager().Lock()

process_list = []

process_name = “process 1”

tmp_process = multiprocessing.Process(target=sub_process,args=(process_name,share_var,share_lock))

process_list.append(tmp_process)

process_name = “process 2”

tmp_process = multiprocessing.Process(target=sub_process, args=(process_name,share_var,share_lock))

process_list.append(tmp_process)

for process in process_list:

process.start()

for process in process_list:

process.join()

if name == “main”:

main_process()

执行结果如下,可以看到进程1中的修改已表现在进程2中(不过要注意,和多线程一样,如果运算量再大一点进程1并不一定比进程2先执行):

在这里插入图片描述

typecode如果是数值或单个字符,可为以下类型(注意有引号):

在这里插入图片描述

如果是字符串类型,typecode可为以下第一列形式(注意无引号):

在这里插入图片描述

三、共享实例化对象实现方法

1 共享不需要修改实例化对象实现方法----使用global

但我们前面说过global方式不可以修改,但读还是没问题的;所以对象引用还是可以使用global方式。

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

import multiprocessing

import threading

实例化一个全局文件对象

file_obj = open(“1.txt”,“a”)

share_lock = threading.Lock()

def sub_process(process_name):

global file_obj,share_lock

share_lock.acquire()

file_obj.writelines(f"{process_name}")

share_lock.release()

pass

def main_process():

process_list = []

创建进程1

process_name = “process 1”

tmp_process = multiprocessing.Process(target=sub_process,args=(process_name,))

process_list.append(tmp_process)

创建进程2

process_name = “process 2”

tmp_process = multiprocessing.Process(target=sub_process, args=(process_name,))

process_list.append(tmp_process)

启动所有进程

for process in process_list:

process.start()

for process in process_list:

process.join()

if name == “main”:

main_process()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

05e862fe4e9.png)

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值