[b0030] python 归纳 (十五)_多进程使用Pool
1 usePool.py
#coding: utf-8
"""
学习进程池使用 multiprocessing.Pool
总结:
1. Pool 池用于处理 多进程,并不是多线程
2. 池有大小的概念
3. 并不是所有的子进程添加完了,才开始启动子进程。 当第一个进程添加到池中的时候,马上就启动了 使用:
1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
2. 往池中添加进程 主要:pool.apply_async(func, (参数, )) or pool.apply(func, (参数, ))
3. 调用 pool.close(); pool.join() (一般伴随 apply_async),等待所有子进程结束 其他:
terminate() 结束工作进程,不再处理未完成的任务
map(...) 将一个集合数据 映射到 同一个函数, 根据集合大小 执行多次子进程
get() 从子进程获取返回结果
"""
import multiprocessing
import time # 进程代码
def func(msg):
print "sub begin:", msg
time.sleep(2)
print "sub end:",msg if __name__ == "__main__":
pool = multiprocessing.Pool(processes = 3) # 创建进程池
for i in xrange(5):
msg = " %d" %(i) # apply_async 非阻塞,一般和join一起使用, apply 阻塞 主进程等待子进程一个接一个执行完
# apply_async 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
# apply_async 这里创建的都是守护进程
pool.apply_async(func, (msg, )) # 实际开发中,每个子线程执行不同的逻辑
time.sleep(1)
print "alread start sub,%d\n" % i print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"
pool.close() # 关闭pool使其不在接受新的任务,必须有
pool.join() # 等待所有子进程结束 调用join之前,先调用close函数,
print "Sub-process(es) done." """
pool.apply_async
Out: sub begin: 0
alread start sub,0 sub begin: 1
alread start sub,1 sub begin: 2
sub end: 0
sub end: 1alread start sub,2 sub begin: 3
alread start sub,3 sub begin: 4
sub end: 2
sub end:alread start sub,4
3 Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
sub end: 4
Sub-process(es) done. """ """
pool.apply
Out: sub begin: 0
sub end: 0
alread start sub,0 sub begin: 1
sub end: 1
alread start sub,1 sub begin: 2
sub end: 2
alread start sub,2 sub begin: 3
sub end: 3
alread start sub,3 sub begin: 4
sub end: 4
alread start sub,4 Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done. """
2 usePoolmap.py
# -*- coding: utf-8 -*-
"""
使用 multiprocessing.Pool.map 执行多进程 逻辑:
有10个大小的列表,进程池4个大小
使用map执行完 总结:
可以简化启动子进程代码 使用:
1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
2. 准备list 数据 i_list = range(10)
3. 准备子进程执行代码 函数 sub_process_code
4. 调用 pool.map(sub_process_code, i_list)
或
pool.map_async(sub_process_code, i_list)
pool.close()
pool.join() """
import multiprocessing
import time
import os
def sub_process_code(x):
# 打印 hh:ss 编号 进程ID
print time.strftime('%M:%S',time.localtime(time.time())),x * x,os.getpid()
time.sleep(3) if __name__ == '__main__':
pool = multiprocessing.Pool(multiprocessing.cpu_count()) # 根据CPU数量创建进程池,这里是4个
i_list = range(10)
pool.map(sub_process_code, i_list) ## 下面3行代码 = 上面一行代码
# pool.map_async(sub_process_code, i_list) # 异步
# pool.close()
# pool.join() # 如果没有join,主进程 结束后,所有子进程马上结束了
print "end" """
Out: 24:20 0 5960
24:20 1 5840
24:20 4 5892
24:20 9 6944
24:23 16 5960
24:23 25 5840
24:23 36 5892
24:23 49 6944
24:26 64 5960
24:26 81 5840
end """
3 usePoolgetData.py
# -*- coding: utf-8 -*-
"""
使用进程池 multiprocessing.Pool,获取子进程的返回数据 使用:
1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
2. 往池中添加进程,同时拿到Result对象 p_ApplyResult_obj = pool.apply_async(func, (参数, ))
3. 调用 pool.close(); pool.join() 等待所有子进程结束
4. 获取子进程的返回数据 p_ApplyResult_obj.get()
""" import multiprocessing
import time # 子进程代码,会return 数据给主进程
def func(msg):
time.sleep(3)
print "end"
return "return " + msg if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = [] # 存储Result对象 for i in xrange(3):
msg = "hello %d" %(i)
# 添加子进程的同时,获取它的返回对象
p_ApplyResult_obj = pool.apply_async(func, (msg, ))
print id(p_ApplyResult_obj) # 打印pool对象 ID
result.append(p_ApplyResult_obj)
pool.close()
pool.join()
for res in result:
print ":::", res.get() # 获取子进程的return结果
print "Sub-process(es) done." """
Out: 41974752
41974864
41975032
endend end
::: return hello 0
::: return hello 1
::: return hello 2
Sub-process(es) done.
"""
4 usePoolCallback.py 使用回调函数
# -*- coding: utf-8 -*-
"""
进程池 回调函数 逻辑: 子进程返回值结束,主进程马上调用回调 函数接收返回值,并打印
总结:
1、回调函数是子进程结束时,由主进程调用的函数
2、个人理解 类似 事件-驱动-动作机制 信号-动作机制 数据库触发器机制
事件 子进程执行结束
动作 执行回调函数 用法:
1. 准备子进程函数Foo, 里面有返回值
2. 准备回调函数Bar,接收参数就是子进程返回值
3. pool.apply_async(func=Foo, args=(i,), callback=Bar)
Foo的参数 是 args
Bar的参数 是 Foo的返回值 """
from multiprocessing import Pool
import time def Foo(i):
"""
字进程代码
:param i:
"""
time.sleep(2)
print i
return i+100 def Bar(arg):
"""
回调函数
:param arg: 子进程执行代码返回值 ,本例是 Foo return i+100
"""
print('----->exec done:',arg) if __name__ == '__main__': # 允许进程池里同时放入5个进程
pool = Pool(5) # 启动10个进程
for i in range(10): # 并行执行,callback回调执行者为父进程
pool.apply_async(func=Foo, args=(i,), callback=Bar) #pool.apply(func=Foo, args=(i,)) # 串行执行 print('end')
pool.close()
pool.join() # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。 """
Out: end
0
('----->exec done:', 100)
1
('----->exec done:', 101)
2
('----->exec done:', 102)
3
('----->exec done:', 103)
4
('----->exec done:', 104)
5
('----->exec done:', 105)
6
('----->exec done:', 106)
7
('----->exec done:', 107)
8
('----->exec done:', 108)
9
('----->exec done:', 109)
"""
参考:
python进程池:multiprocessing.pool
[b0030] python 归纳 (十五)_多进程使用Pool的更多相关文章
- [b0040] python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore
# -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore 逻辑: 启动5个进程,打印,每个各自睡 ...
- Python爬虫(十五)_案例:使用bs4的爬虫
本章将从Python案例讲起:所使用bs4做一个简单的爬虫案例,更多内容请参考:Python学习指南 案例:使用BeautifulSoup的爬虫 我们已腾讯社招页面来做演示:http://hr.ten ...
- [b0041] python 归纳 (二六)_多进程数据共享和同步_事件Event
# -*- coding: utf-8 -*- """ 多进程 同步 事件multiprocessing.Event 逻辑: 子线程负责打印,会阻塞, 等待主进程发出控制 ...
- [b0039] python 归纳 (二四)_多进程数据共享和同步_锁Lock&RLock
# -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共 ...
- [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe
# -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...
- [b0036] python 归纳 (二一)_多进程数据共享和同步_服务进程Manager
# -*- coding: utf-8 -*- """ 多进程数据共享 服务器进程 multiprocessing.Manager 入门使用 逻辑: 20个子线程修改共享 ...
- [b0034] python 归纳 (十九)_线程同步_条件变量
代码: # -*- coding: utf-8 -*- """ 学习线程同步,使用条件变量 逻辑: 生产消费者模型 一个有3个大小的产品库,一个生产者负责生产,一个消费者 ...
- [b0027] python 归纳 (十二)_并发队列Queue的使用
# -*- coding: UTF-8 -*- """ 学习队列 Queue 总结: 1. 队列可以设置大小,也可以无限大小 2. 空了,满了,读写时可以阻塞,也可以报错 ...
- Python笔记(十五)_异常处理
try-except语句 try: 被检测代码 except Exception [as reason]: 出现异常后的处理代码 例: try: sum = 1+' f=open('未定义文件.txt ...
随机推荐
- JavaWeb问题记录——在Windows上启动Tomcat后命令行窗口乱码
JavaWeb问题记录——在Windows上启动Tomcat后命令行窗口乱码 摘要:本文主要记录了在Windows上启动Tomcat后,命令行窗口出现乱码的问题及解决办法. 问题重现 在Windows ...
- SpringCloud(八):springcloud-bus消息总线(刷新配置服务)
Bus消息总线: 好了现在我们接着上一篇的随笔,继续来讲.上一篇我们讲到,我们如果要去更新所有微服务的配置,在不重启的情况下去更新配置,只能依靠spring cloud config了,但是,是我们要 ...
- 对cookie-parser的理解(签名、加密)
1.为什么说要利用签名防止cookie被恶意篡改 我们在浏览器输入用户名和密码发送post请求到后端服务器,后端服务器验证合法,返回响应,并Set-Cookie为sessionid=***;usern ...
- 使用Graphviz和Pyreverse绘制Python项目结构图
使用Graphviz和Pyreverse绘制Python项目结构图 简介 Graphviz开源的图形绘制工具包 Pyreverse分析Python代码和类关系的工具 安装 安装Graphviz 官网下 ...
- MyBatis之接口绑定方案及多参数传递
1.说明 所谓的MyBatis接口绑定,指的是实现创建一个接口后,把mapper.xml 由mybatis 生成接口的实现类,通过调用接口对象就可以获取mapper.xml 中编写的sql.在SS ...
- Linux CentOS 6.5 卸载、安装JDK1.8
卸载系统自带的jdk 1. 查询系统是否已经安装了jdk rpm -qa|grep java 2. 卸载已安装的jdk, 系统可能会自带多个jdk版本, 按需卸载 rpm -e --nodeps ja ...
- 安装pymssql
直接安装失败 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql 去下载对应的 pymssql whl版本 之后 pip install whe ...
- 修改SQL Server中的计算机名
安装SQL Server之后,如果修改计算机名会导致登录异常,或者某些功能不能用,例如配置Replication时会提示如下错误: SQL Server replication requires th ...
- 一文学会 TypeScript 的 82% 常用知识点(上)
前端专栏 2019-11-22 19:17:55 对于前端从业者来说,TypeScript(以下简称 TS)已经不算是新技术. Vue3 的源码基于 TS 编写, Angular 项目默认支持 TS ...
- Spring的增强模式
一.前置增强 1.IdoSomeService 2.IdoSomeServiceImpl类实现IdoSomeService接口 3.MyBeforeAdvice 实现前置增强方法 4.applicat ...