一篇文章学习Python中的多进程

基本知识:

    • 一、什么是多进程 Multiprocessing
    • 二、添加多进程 Process
    • 三、存储进程输出 Queue
    • 四、效率对比 threading & multiprocessing
    • 五、进程池 Pool
    • 六、共享内存 shared memory
    • 七、进程锁 Lock

一、什么是多进程 Multiprocessing

支持并行运算,充分利用计算机的多核CPU

二、添加多进程 Process

import multiprocessing as mpdef process_job(a,b):print("a:",a)print("b:",b)if __name__=="__main__":p1 = mp.Process(target=process_job,args=(1,2))  # 定义一个进程p1p1.start()                                      # 开启进程p1p1.join()                                       # 将进程p1加入到主进程

三、存储进程输出 Queue

多进程调用的函数不能有返回值,故使用Queue存储结果。

import multiprocessing as mpdef process_job(q):res = 0for i in range(10):res += iq.put(res)if __name__=="__main__":q = mp.Queue()p1 = mp.Process(target=process_job,args=(q,))  # 注意args必须是可迭代的类型,但只有一个参数的时候,要加一个逗号p2 = mp.Process(target=process_job,args=(q,))p1.start()p2.start()p2.join()p1.join()print("res1:",q.get())print("res2:",q.get())

四、效率对比 threading & multiprocessing

import multiprocessing as mp
import threading as td
import timedef job(q):res = 0for i in range(100000):res += i + i**2 + i**3q.put(res)def multiProcess():    # 多进程运算q = mp.Queue()p1 = mp.Process(target=job,args=(q,))  p2 = mp.Process(target=job,args=(q,))  p1.start()p2.start()p2.join()p1.join()print("multiProcess_res:",q.get()+q.get())def multiThread():    # 多线程运算q = mp.Queue()t1 = td.Thread(target=job,args=(q,))t2 = td.Thread(target=job,args=(q,))t1.start()t2.start()t2.join()t1.join()print("numliThread_res:",q.get()+q.get())def normal():         # 普通运算res = 0for _ in range(2):for i in range(100000):res += i + i**2 + i**3print("normal_res:",res)if __name__=="__main__":t1 = time.time()normal()t2 = time.time()print("normal_time:",t2-t1)multiProcess()t3 = time.time()print("multiProcess_time:",t3-t2)multiThread()t4 = time.time()print("multiThread_time:",t4-t3)

结果:运行时间 多进程 < 多线程 (多线程和普通的运行时间差不多)

normal_res: 49999666671666600000
normal_time: 0.2157750129699707
multiProcess_res: 49999666671666600000
multiProcess_time: 0.14542102813720703
numliThread_res: 49999666671666600000
multiThread_time: 0.2052018642425537

五、进程池 Pool

相当于批量处理多进程
与 Process 不同的是,Pool 有返回值,返回值是一个 list,依次是每个进程执行的结果。

import multiprocessing as mpdef job(x):return x*xdef multicore():pool = mp.Pool(processes=2)       res = pool.map(job, range(10))     # 方式一:使用 pool 的 map 函数print(res)res = pool.apply_async(job, (2,))print(res.get())multi_res =[pool.apply_async(job, (i,)) for i in range(10)]   #方式二:使用 pool 的 apply_async 函数print([res.get() for res in multi_res])if __name__ == '__main__':multicore()

六、共享内存 shared memory

在上一篇文章的第六部分线程锁可以看到,对于一个全局变量,多个线程之间共享全局变量,一个线程对全局变量修改以后,其他线程访问到的是修改后的全局变量,会造成数据的混乱。
与多线程不同的是,多进程不会共享全局变量,多个进程之间不进行交流,任意一个进程对全局变量的修改都不会影响到其他进程对全局变量的访问。
比如:

import multiprocessing as mpdef job1():global Afor i in range(3):A += 1print("Job1:",A)
def job2():global Afor i in range(3):A += 10print("Job2:",A)if __name__=="__main__":A = 0p1 = mp.Process(target=job1)p2 = mp.Process(target=job2)p1.start()p2.start()p2.join()p1.join()

结果:互不影响

1
2
10
3
20
30

因此,需要设置共享内存,让进程之间进行交流:
1、Shared Value
通过使用 Value 将数据存储在一个共享的内存表中

import multiprocessing as mpvalue1 = mp.Value('i', 0) 
value2 = mp.Value('d', 3.14)

其中 d 和 i 参数用来设置数据类型的,d 表示一个双精浮点类型,I 表示一个带符号的整型。
2、Shared Array
mutiprocessing中,有还有一个Array类,可以和共享内存交互,来实现在进程之间共享数据

array = mp.Array('i', [1, 2, 3, 4])

这里的Array和numpy中的不同,它只能是一维的,不能是多维的。同样和Value 一样,需要定义数据形式,否则会报错。
参数数据类型表

七、进程锁 Lock

1、不加进程锁

import multiprocessing as mp
import timedef job(v, num):for _ in range(5):time.sleep(0.1) # 暂停0.1秒,让输出效果更明显v.value += num # v.value获取共享变量值print(v.value, end="")def multicore():v = mp.Value('i', 0) # 定义共享变量p1 = mp.Process(target=job, args=(v,1))p2 = mp.Process(target=job, args=(v,3)) # 设定不同的number看如何抢夺内存p1.start()p2.start()p1.join()p2.join()    if __name__ == '__main__':multicore()

结果:进程1和进程2在相互抢着使用共享内存v

1
4
5
8
9
12
13
16
17
20

2、加进程锁

import multiprocessing as mp
import timedef job(v, num, l):l.acquire()for _ in range(10):time.sleep(0.1)v.value += numprint(v.value)l.release()def multicore():l = mp.Lock()v = mp.Value('i', 0)p1 = mp.Process(target=job, args=(v, 1, l))p2 = mp.Process(target=job, args=(v, 3, l))p1.start()p2.start()p1.join()p2.join()if __name__ == '__main__':multicore()

结果:显然,进程锁保证了进程p1的完整运行,然后才进行了进程p2的运行

1
2
3
4
5
8
11
14
17
20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML是什么?UML常用图以及建模工具有哪些?

“ 在做项目设计方案的时候&#xff0c;理解为需求后&#xff0c;我们都会做技术设计方案&#xff0c;这个时候就需要用到UML建模&#xff0c;涉及到UML常用图形以及工具画图&#xff0c;以下我会详细介绍UML图形和我个人推荐的UML建模工具。 UML即Unified Model Language&am…

炼丹必备!推荐一个超级好用的机器学习云平台

矩池云是一个专业的国内深度学习云平台&#xff0c;拥有着良好的深度学习云端训练体验&#xff0c;和高性价比的自建GPU集群资源。高性价比矩池云拥有很高的性价比&#xff0c;其的计费方式主要分为按时租与按周/月租。按时租用采用的是分钟级的实时计费模式&#xff0c;满足了…

直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

JVM基本是BAT面试必考的内容&#xff0c;今天我们先从JVM内存模型开启详解整个JVM系列&#xff0c;希望看完整个系列后&#xff0c;可以轻松通过BAT关于JVM的考核。 BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃圾回收算法 3.JVM垃圾回收器 4.JVM参数详解 5.JVM性能调优 JV…

论文浅尝 | 基于平行新闻的Bootstrapping关系抽取

笔记整理&#xff1a;吴锐&#xff0c;东南大学大四本科生&#xff0c;研究方向为自然语言处理。Citation&#xff1a;Michael Glass, K. B. . (2012). Bootstrapping relation extraction using parallel news articles. Retrieved from https://pdfs.semanticscholar.org/bfa…

动态规划应用--最长递增子序列 LeetCode 300

文章目录1. 问题描述2. 解题思路2.1 动态规划2.2 二分查找1. 问题描述 有一个数字序列包含n个不同的数字&#xff0c;如何求出这个序列中的最长递增子序列长度&#xff1f;比如2&#xff0c;9&#xff0c;3&#xff0c;6&#xff0c;5&#xff0c;1&#xff0c;7这样一组数字序…

常见的面试题整理 -python

常见的面试题整理 在这里插入代码片 #二分查找def binarySearch(alist, item):first0;lastlen(alist)-1;while first < last:mid(firstlast)/2;print(mid)if alist[mid]>item:lastmid-1;elif alist[mid]<item:firstmid1return -1test[0,1,2,8,13,17,19,9,0]print(bin…

Python中的全局变量

一、全局变量的定义与调用 在主进程中定义的变量属于全局变量&#xff0c;如下面的变量a、b、c&#xff0c;都是全局变量。 如果只是调用全局变量&#xff0c;不对其进行修改&#xff0c;可直接调用。 a 1 b [2,2]def f1():print(a)print(b)print(c) if __name__ __mai…

论文浅尝 | 5 篇顶会论文带你了解知识图谱最新研究进展

本文转载自公众号&#xff1a;PaperWeekly。精选 5 篇来自 ICLR 2019、WSDM 2019、EMNLP 2018、CIKM 2018和IJCAI 2018 的知识图谱相关工作&#xff0c;带你快速了解知识图谱领域最新研究进展。WSDM 2019■ 论文解读 | 张文&#xff0c;浙江大学在读博士&#xff0c;研究方向为…

LeetCode 53. 最大子序和(动态规划)

文章目录1. 题目描述2. 解题2.1 暴力求解2.2 动态规划1. 题目描述 题目链接&#xff1a;https://leetcode-cn.com/problems/maximum-subarray/ 《剑指Offer》同题&#xff1a;面试题42. 连续子数组的最大和 给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组…

java程序员的发展之路和职业规划

在互联网做技术的朋友&#xff0c;往往没有足够的重视&#xff0c;职业规划其实一点都不虚&#xff0c;而是一件非常实在的事情&#xff0c;如果你不是每次碰墙再反思职业规划&#xff0c;而是提前3年左右作出下一步的规划&#xff0c;你早已经走出了一条属于自己的路。 以下是…

Python多进程中多参数问题

要注意的一点是&#xff1a;传递给进程的参数必须是可序列化的&#xff0c;常见的数据类型都是可序列化的&#xff0c;自定义的类一般是不可序列化的&#xff0c;&#xff08;在java中有将自定类写为可序列化的方式&#xff0c;不知道python中有没有&#xff0c;懒得查了&#…

机器学习(Machine Learning)、深度学习(Deep Learning)、NLP面试中常考到的知识点和代码实现

网址&#xff1a;https://github.com/NLP-LOVE/ML-NLP 此项目是机器学习(Machine Learning)、深度学习(Deep Learning)、NLP面试中常考到的知识点和代码实现&#xff0c;也是作为一个算法工程师必会的理论基础知识。 http://mantchs.com/ 此项目是机器学习、NLP面试中常考到的…

图Graph--拓扑排序(Topological Sorting)

文章目录1. 拓扑排序2. 算法实现2.1 Kahn算法2.2 DFS算法2.3 时间复杂度3. 应用4. 类似题目练习一个项目往往会包含很多代码源文件。编译器在编译整个项目时&#xff0c;需按照依赖关系&#xff0c;依次编译每个源文件。比如&#xff0c;A.cpp依赖B.cpp&#xff0c;那在编译时&…

SIGIR20最佳论文:通往公平、公正的Learning to Rank!

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 机智的叉烧编 | 兔子酱大家好&#xff0c;我是叉烧。感谢卖萌屋再次给我机会在这里分享~SIGIR2020 的 best paper 终于出炉&#xff0c;这次获奖论文是 Controlling Fairness and Bias in Dynamic Learn…

论文浅尝 | 基于属性嵌入的知识图谱间实体对齐方法

笔记整理&#xff1a;张清恒&#xff0c;南京大学计算机科学与技术系&#xff0c;硕士研究生。论文链接&#xff1a;https://people.eng.unimelb.edu.au/jianzhongq/papers/AAAI2019_EntityAlignment.pdf发表会议&#xff1a;AAAI 2019摘要近来&#xff0c;针对跨知识图谱&…

一篇文章了解架构师能力模型

每一个技术人都有着一个架构师的梦&#xff0c;希望自己有朝一日能登上技术之巅&#xff0c;以下结合我自己13年的从业经验&#xff0c;分别从架构师进阶之路、架构师能力模型&#xff08;这里是亮点&#xff09;、架构师技能树、架构师业务技能树谈起&#xff0c;完整的剖析一…

python引用自己的文件的一切问题

目录关于引入和使用方法方式一&#xff1a;调用另一个文件的变量和函数方式二&#xff1a;调用另一个文件的类关于执行顺序关于引入和使用方法 方式一&#xff1a;调用另一个文件的变量和函数 main.py from batch import *print("在main调用batch的变量NUM&#xff1a;…

首篇严肃的“BERT学”研究,40+论文对比,解读 BERT 工作原理

BERT解读&#xff08;论文 TensorFlow源码&#xff09;&#xff1a;https://blog.csdn.net/Magical_Bubble/article/details/89514057?depth_1- 解读ALBERT&#xff1a; https://blog.csdn.net/weixin_37947156/article/details/101529943 一文揭开ALBERT的神秘面纱&#…

图Graph--最短路径算法(Shortest Path Algorithm)

文章目录1. 算法解析BFS,DFS 这两种算法主要是针对无权图的搜索算法。针对有权图&#xff0c;图中的每条边都有权重&#xff0c;如何计算两点之间的最短路径&#xff08;经过的边的权重和最小&#xff09;呢&#xff1f;像Google地图、百度地图、高德地图这样的地图软件&#x…

BAT架构师进阶:大型网站架构书籍推荐

“ 书籍推荐分为如下&#xff1a; 大型网站架构系列 分布式系统系列 BAT技术系列 架构设计系列 一&#xff1a;大型网站架构系列 第一本&#xff1a;《大型网站技术架构&#xff1a;核心原理与案例分析》 这本书主要从大型网站架构的特点&#xff0c;架构目标&#xff08…