进程池原理及效率测试Pool
为什么会有进程池的概念?
当我们开启50个进程让他们都将100这个数减1次减到50,你会发现特别慢!
效率问题,原因:
1,开辟内存空间。因为每开启一个进程,都会开启一个属于这个进程池的内存空间,因为进程与进程之间数据是完全隔离的。
2,并且这些独立的内存空间会有许多寄存器,堆栈,文件等,他们存着这个进程里面的变量和数据等。所以生成这些东西都会耗时。
3,生成这么多进程,都需要系统调度,这个也会耗时。不仅这样,还会涉及到进程使用cpu的时候,当a进程使用一段时间cpu,b进程要去使用cpu,za和b中间的节点不仅要记录a进程执行到这,还要调用b进程之前执行的结果,所以在这个节点不仅涉及到cpu的切换,还涉及到寄存器,堆栈等包含的数据,还有内存空间的切换。
所以,我们不会无休止的去开启进程,而是设计一个池子,这个池子就是进程池。
进程池的含义?
python中的进程池,在你还没有创建进程之前,先创建一个属于进程的池子。这个池子指定能存放多少个进程,比如说5个进程,因此会先创建这5个进程。当任务进来的时候,比如说50个任务需要50个进程去处理,但是不会生成50个进程,而是排队去进程池里面拿进程处理任务,所以同一时刻最多有5个进程在处理任务,当任务处理完毕,不会将进程销毁,而是放回到进程池,在让其他任务进来让这些进程处理。
所以,进程池的优点有:
1,提高效率,节省开辟进程和开辟内存空间的时间及销毁进程的时间。
2,节省内存空间。
更高级的进程池:
这种进程池不给设置固定数量的进程,而是有一个范围,比如最少3个进程,最多30个进程。当任务或用户量增加时,进程池里面的进程数量会加加加,一直加到最大值,当任务或用户量减少,造成很多进程长时间没用,就会减减减,直到减到最小值。这样做的好处会系统回收用不到的进程,会给操作系统减负。
但是python里面只有第一种进程池,他不会将进程池进行收缩。
怎么使用?如下代码:
from multiprocessing import Pool def func(n):
for i in range(3):
print(n +1) # 将传入的值打印三次,1到10每个值打印三次 if __name__ == "__main__":
pool = Pool(5) # 创建了一个包含5个进程的进程池
pool.map(func, range(10)) # 这样用map就起进程了,另外range(10)这个位置传的值一定要是可迭代的,map只能传可迭代的。10个任务
# map是异步的,并且不需要close()和join(),并且把每一个返回值放到一个列表中,直接显示出来。
进程池的效率测试:
from multiprocessing import Pool
import time def func(n):
for i in range(10): # 将1到100,每个数打印十次
print(n +1) if __name__ == "__main__":
start = time.time()
pool = Pool(5)
pool.map(func, range(100)) # 一百个任务
t2 = (time.time() - start)
print(t2) # 打印花费时间,时间是0.26130008697509766
然后看起100个进程去处理相同数量的任务:
from multiprocessing import Process
import time def func(n):
for i in range(10): # 同样将1到100,每个数打印十次
print(n+1) if __name__ == "__main__":
t1 = time.time()
p_list = []
for i in range(100):
p = Process(target=func, args=(i,))
p_list.append(p)
p.start()
for p in p_list:
p.join()
t2 = (time.time() - t1)
print(t2) # 3.882610321044922
对比时间差别太大了,进程池的5个进程却比创建100个进程做同样的事儿快的太多了。
合并到同一个代码里面再看效果:
from multiprocessing import Process, Pool
import time
def func(n):
for i in range(10):
print(n + 1) if __name__ == "__main__":
t1 = time.time()
pool = Pool(5)
pool.map(func, range(100))
t2 = time.time() - t1
t3 = time.time()
p_list = []
for i in range(100):
p = Process(target=func, args=(i,))
p_list.append(p)
p.start()
for p in p_list:
p.join()
t4 = time.time() - t3
print(t2, t4)
打印结果:
0.2582840919494629 4.1498963832855225
所以,进程池的效率比开多个进程效率高得多。
进程池原理及效率测试Pool的更多相关文章
- Python--day39--进程池原理及效率测试
#为什么要有进程池的概念 #效率 #每次开启进程都要创建一个属于这个进程的内存空间 #寄存器 堆栈 文件 #进程过多 操作系统调度进程 # #进程池 #python中的 先创建一个属于进程的池子 #这 ...
- Python-进程-进程池-原理
进程 资源集合,调度和分配资源,说到进程就不得不提到线程,线程和进程是密不可分,进程申请了资源,但真正使用资源的是线程,其实本质上类似面向对象的思想,面向对象把数据和数据的操作封装在一个类中,进程把资 ...
- Python之进程 3 - 进程池和multiprocess.Poll
一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...
- python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...
- [转]Python多进程并发操作中进程池Pool的应用
Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...
- 进程池 和 multiprocessing.Pool模块
进程池的概念 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁 ...
- Python多进程并发操作中进程池Pool的应用
Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...
- 进程池和multiprocess.Pool模块
一.为什么要有进程池 首先,创建进程需要消耗时间,销毁进程也需要时间.其次,即使开启了成千上万的进程,操作系统也不能让它们同时执行,这样反而会影响程序的效率.因此我们不能无限制的根据任务开启或者结束进 ...
随机推荐
- Listener(1)—基础知识
一.监听器 1.概念: 专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监听的对象状态发生情况时,立即采取相应的 行动.Servlet规范为每种事件监听器都定义了相应的接口,w ...
- java springboot2 jquery 抽奖项目源码
java+springboot2+jquery+jdk8 实现的多种抽奖效果! 体验抽奖地址: http://47.98.175.6:8091/ 赞助获得源码!!!
- 集合总结--ArrayList、LinkedList、HashMap
一.概述 ArrayList:数组集合. 查询.修改.新增(尾部新增)快,删除.新增(队列中间)慢,适用于查询.修改较多的场景. LinkedList:双向链表集合.查 ...
- GBK转UTF8
shell 脚本自动GBK转UTF8 for i in `find . -name "*.java"`; do iconv -f gbk -t utf-8 $i > $i.n ...
- 每天一个linux命令:chmod
1.命令简介 chmod(Change mode) 用来将每个文件的模式更改为指定值.Linux/Unix 的档案调用权限分为三级 : 档案拥有者.群组.其他. u :目录或者文件的当前的用户 g : ...
- sort is deprecated, use sort_values(inplace=True) for INPLACE sorting
排序是过时的,用sort_values(到位=真)为就地排序
- 1154:LETTERS
题目链接http://bailian.openjudge.cn/practice/1154/ 总时间限制: 1000ms 内存限制: 65536kB 描述 A single-player game i ...
- 51单片机stack堆栈
一般编译器的堆栈用于保存局部变量.函数的参数.函数的返回值.中断上下文信息等.但Keil对局部变量.函数参数预先分配空间(放在静态全局变量区),Keil的堆栈只是用于保存函数嵌套调用的PC.中断上下文 ...
- 简单理解 RPC(转载)
原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.html RPC(Remote Procedure Call P ...
- hdu 3068 最长回文(manacher&最长回文子串)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...