41.进程池--Pool
进程池
- 方便创建,管理进程,单独进程的Process创建,需要手动开启,维护任务函数,以及释放回收
- 进程池不需要这么麻烦,进程提前创建好,未来在使用的时候,可以直接给与任务函数
- 某个进程池中的任务结束了,占用的进程会自己释放刚才工作的事情,以便接收下一个
- P = Pool(num) #创建一个包含有num个空闲进程的池子
- p.apply() 填充任务,任务如果结束,会自动释放掉当前占用的进程
- 创建大规模任务,Pool(100)
- 1,创建进程池:进程池中的进程是可以复用的
- from mutliprocessing import Pool
- p = Pool(num)
- num:指明当前多少空闲进程创建出来
- p.apply(func,args,)
- 阻塞行为
- func:指明填充功能函数名
- args:对应的参数
- 阻塞行为相当于(lock)加锁的进程池工作方式,有序的,第一个执行完才会执行第二个
- p.apply_async(func,args,)
- 非阻塞行为,并发的,无序的
- p.close()
- 在整个业务结束之后,进程池要首先关闭
- 关闭之后进程池里的旧任务会继续执行但是没有办法填充新的任务
- 进程池关闭了就无法打开
- p.join()
- 进程回收,把关闭了的进程池中的每个进程join() 释放回收掉
- p.terminate()
- 直接关闭进程池,并且终止所欲偶进程
- 2,进程池的工作的返回值:
- res = p.apply(func,)
- res就是进程池的工作结果
- 立竿见影就可以看到结果,就因为apply填充任务是阻塞行为
- res = p.apply_aysnc(func,)
- 非阻塞的结果,可以立即拿到,但是不是结果,只是一个抽象虚拟的值
- 这个值代表进程结束后的返回值
- res.get() #使用要谨慎
- 当前非阻塞执行的进程,有优先级先结束
- 强制要求立即这个结果,但是会影响进程之间的并发效果
- res = p.apply(func,)
- 3,进程池中的通信队列是特殊的
- from multiprocessing import Manager
- q = Manager().Queue() #进程共享队列
- 无法使用管道(Pipe)
#进程池创建
from multiprocessing import Pool
import sys
def work_a():
for var in range(1,5):
print(var)
sys.stdout.flush()
def work_b():
for var in range(5,10):
print(var)
sys.stdout.flush()
def work_c():
for var in range(10,15):
print(var)
sys.stdout.flush()
def main():
p = Pool(2) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数
#p.apply_async(func=work,args=(a,b),) 非阻塞行为
p.apply(func=work_a)#阻塞行为
p.apply(func=work_b)
p.apply(func=work_c)
#?: 是否是阻塞行为执行完这三个任务
#阻塞的话:1个等一个,同步
#非阻塞:异步
p.close()
p.join()
if __name__ == '__main__':
main()运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14#获取阻塞进程池返回结果
from multiprocessing import Pool
import sys
def work_a():
for var in range(1,5):
print(var)
sys.stdout.flush()
return 'a'
def work_b():
for var in range(5,10):
print(var)
sys.stdout.flush()
return 'b'
def work_c():
for var in range(10,15):
print(var)
sys.stdout.flush()
return 'c'
def main():
p = Pool(2) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数
res1 = p.apply(func=work_a) #阻塞的一个等一个,res1执行完才会执行res2
res2 = p.apply(func=work_b)
res3 = p.apply(func=work_c)
print('res1进程返回结果:%s' % res1),print('res2进程返回结果:%s' % res2),print('res3进程返回结果:%s' % res3)
p.close(),p.join()
if __name__ == '__main__':
main()运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
res1进程返回结果:a
res2进程返回结果:b
res3进程返回结果:c#获取非阻塞进程池返回结果
from multiprocessing import Pool
import sys
def work_a():
for var in range(1,5):
# print(var)
sys.stdout.flush()
return 'a'
def work_b():
for var in range(5,10):
# print(var)
sys.stdout.flush()
return 'b'
def work_c():
for var in range(10,15):
# print(var)
sys.stdout.flush()
return 'c'
def main():
p = Pool(2) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数
res1 = p.apply_async(func=work_a) #非阻塞的会返回一个抽象的数据
res2 = p.apply_async(func=work_b)
res3 = p.apply_async(func=work_c)
print('res1进程返回结果:%s' % res1.get()),print('res2进程返回结果:%s' % res2.get()),print('res3进程返回结果:%s' % res3.get())
p.close(),p.join()
if __name__ == '__main__':
main()运行结果:
res1进程返回结果:a
res2进程返回结果:b
res3进程返回结果:c#进程池通讯--Queue
from multiprocessing import Pool,Manager,Queue
from time import sleep
import sys
def work_a(q):
#生产者 放十次
for var in range(10):
print('生产者:',var)
sys.stdout.flush()
q.put(var)
sleep(1)
def work_b(q):
#消费者,拿十次
for var in range(10):
res = q.get() #阻塞行为
print('消费者:',var)
sys.stdout.flush()
def main():
q = Manager().Queue() #进程共享队列
p = Pool(5) #进程可以复用
p.apply_async(func=work_a,args={q,q})
p.apply_async(func=work_b,args={q,q})
p.close()
p.join()
if __name__ == '__main__':
main()运行结果:
生产者: 0
消费者: 0
生产者: 1
消费者: 1
生产者: 2
消费者: 2
生产者: 3
消费者: 3
生产者: 4
消费者: 4
生产者: 5
消费者: 5
生产者: 6
消费者: 6
生产者: 7
消费者: 7
生产者: 8
消费者: 8
生产者: 9
消费者: 9
41.进程池--Pool的更多相关文章
- [转]Python多进程并发操作中进程池Pool的应用
Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...
- Python多进程并发操作中进程池Pool的应用
Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...
- python 使用进程池Pool进行并发编程
进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到mu ...
- python 进程池pool简单使用
平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘ ...
- Python多进程库multiprocessing中进程池Pool类的使用[转]
from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- 多任务-进程之进程池Pool
1.什么是池? 首先从字面上看,池代表着一个容器,用来承载着某些内容的容器,了解到这里,就对进程池有了一个初步的轮廓. 2.什么是进程池Pool? (1)利用现实中的事物来理解: 对于小白初学者,接触 ...
- Python多进程库multiprocessing创建进程以及进程池Pool类的使用
问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...
- Python 之并发编程之manager与进程池pool
一.manager 常用的数据类型:dict list 能够实现进程之间的数据共享 进程之间如果同时修改一个数据,会导致数据冲突,因为并发的特征,导致数据更新不同步. def work(dic, lo ...
随机推荐
- rect dict tect 词根助记
rect: r (跑)e(E 槽子)ct(不停的跑) 就是直的 dict: d(椅子)i(人)C(开口说)t(T 桌子) : 椅子前站人 开口说前面是桌子 tect: tt(TT像盖子)EC(E ...
- 慕课网SSM仿大众点评
目录: 配置部分: 1 配置报错不支持diamond运算符 运行部分: 1 登录的账号密码 2 运行项目是报错session超时 配置部分 1 配置报错不支持diamond运算符 原报错信息如下:id ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 【 题目:so easy】{并查集维护一个数的下一个没有被删掉的数} 补题ING
题意:给[1,n],n个数,有两种操作: 1 x,删去x2 x,查询还未被删去的数中大于等于x的最小的数是多少. input: output: 做法:按照并查集的方法压缩路径 代码: #include ...
- Ubuntu: error: snap “phpstorm” has “install-snap” change in progress
Ubuntu: error: snap “phpstorm” has “install-snap” change in progress 投稿日 : 2019-06-10 | カテゴリー : linu ...
- STS工具:mybayis连接oracle数据库
1.pom.xml文件中的依赖 刚添加依赖的时候会报错,原因是jar包下不下来. 2.我的jdk是1.6,所以需要升级jdk版本到1.8 执行mvn -v命令,可以看到maven的版本号 DOS窗口执 ...
- [POI2015]LAS
洛谷题目链接 动态规划: 这里用一种我想不到的思想,我们以美食来转移,设计状态$f[i][S](S\in\{0\sim3\})$其中$S$为$0$时表示第$i$个食物没有被人选,$1$表示被左边的人选 ...
- 2018 Nowcoder Multi-University Training Contest 5
Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...
- mac安装需要的骚操作
显示隐藏文件 defaults write com.apple.finder AppleShowAllFiles -bool true; KillAll Finder 允许任何来源 sudo spct ...
- Java主线程在子线程执行完毕后再执行
一.join() Thread中的join()方法就是同步,它使得线程之间由并行执行变为串行执行. public class MyJoinTest { public static void main( ...
- Java的Lambda表达式
Java的Lambda表达式 1. 什么是Lambda表达式 简单的说,Lambda表达式就是匿名方法.Lambda表达式让程序员能够使用更加简洁的代码,但是同样也使代码的可读性比较差. Lambda ...