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()
2 共享需要修改实例化对象实现方法----使用BaseManager
global方式不能修改变量(如要修改其成员变量),在大多时候也是可以了,但总让人觉得不是一种完美的实现方法。有没有可以修改的实现方法呢,答案是有的,可以使用BaseManager。示例代码如下。
import multiprocessing
from multiprocessing.managers import BaseManager
import threading
锁可以通过global也可以在Process中传无所谓
share_lock = threading.Lock()
定义一个要共享实例化对象的类
class Test():
def init(self):
self.test_list = [“start flag”]
def test_function(self,arg):
self.test_list.append(arg)
def print_test_list(self):
for item in self.test_list:
print(f"{item}")
def sub_process(process_name,obj):
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
的上涨和关注,礼尚往来总是要有的:**
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-VJmdRPgn-1712850833769)]