【python】详解multiprocessing多进程-Pool进程池模块(二)
【python】详解multiprocessing多进程-process模块(一)
【python】详解multiprocessing多进程-Pool进程池模块(二)
【python】详解multiprocessing多进程-Queue、Pipe进程间通信(三)
【python】详解multiprocessing多进程-Lock、Rlock进程同步(四)
【python】详解multiprocessing多进程-总结(五)
Multiprocessing.Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行它。Pool类用于需要执行的目标很多,而手动限制进程数量又太繁琐时,如果目标少且不用控制进程数量则可以用Process类。
class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])
- processes: 是要使用的工作进程数。如果进程是None,那么使用返回的数字os.cpu_count()。也就是说根据本地的cpu个数决定,processes小于等于本地的cpu个数;
- initializer: 如果initializer是None,那么每一个工作进程在开始的时候会调用initializer(*initargs)。
- maxtasksperchild:工作进程退出之前可以完成的任务数,完成后用一个新的工作进程来替代原进程,来让闲置的资源被释放。maxtasksperchild默认是None,意味着只要Pool存在工作进程就会一直存活。
- context: 用在制定工作进程启动时的上下文,一般使用 multiprocessing.Pool() 或者一个context对象的Pool()方法来创建一个池,两种方法都适当的设置了context。
实例方法
1.1、apply(func [,args [,kwds ] ] )
使用参数args和关键字参数kwds调用func。它会阻塞,直到结果准备就绪。鉴于此块,更适合并行执行工作。此外,func 仅在池中的一个工作程序中执行。
from multiprocessing import Pool
import time
def test(p):print(p)time.sleep(3)
if __name__=="__main__":pool = Pool(processes=10)for i in range(500):'''('\n'' (1)遍历500个可迭代对象,往进程池放一个子进程\n'' (2)执行这个子进程,等子进程执行完毕,再往进程池放一个子进程,再执行。(同时只执行一个子进程)\n'' for循环执行完毕,再执行print函数。\n'' ')'''pool.apply(test, args=(i,)) #维持执行的进程总数为10,当一个进程执行完后启动一个新进程.print('test')pool.close()pool.join()'''
1
2
3
4
5
6
7
8Process finished with exit code -1
'''
for循环内执行的步骤顺序,往进程池中添加一个子进程,执行子进程,等待执行完毕再添加一个子进程……等500个子进程都执行完了,再执行print。(从结果来看,并没有多进程并发)
1.2、apply_async(func [,args [,kwds [,callback [,error_callback ] ] ] ] )
异步进程池(非阻塞),返回结果对象的方法的变体。如果指定了回调,则它应该是可调用的,它接受单个参数。当结果变为就绪时,将对其应用回调,即除非调用失败,在这种情况下将应用error_callback。如果指定了error_callback,那么它应该是一个可调用的,它接受一个参数。如果目标函数失败,则使用异常实例调用error_callback。回调应立即完成,否则处理结果的线程将被阻止。
from multiprocessing import Pool
import time
def test(p):print(p)time.sleep(3)
if __name__=="__main__":pool = Pool(processes=2)for i in range(500):'''(1)循环遍历,将500个子进程添加到进程池(相对父进程会阻塞)\n'(2)每次执行2个子进程,等一个子进程执行完后,立马启动新的子进程。(相对父进程不阻塞)\n''''pool.apply_async(test, args=(i,)) #维持执行的进程总数为10,当一个进程执行完后启动一个新进程.print('test')pool.close()pool.join()'''
test
0
1
2
3
4
5
6
7Process finished with exit code -1'''
调用join之前,先调用close或者terminate方法,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束。
1.3、map(func,iterable [,chunksize ] )
map()内置函数的并行等价物(尽管它只支持一个可迭代的参数)。它会阻塞,直到结果准备就绪。此方法将iterable内的每一个对象作为单独的任务提交给进程池。可以通过将chunksize设置为正整数来指定这些块的(近似)大小。
from multiprocessing import Pool
def test(i):print(i)
if __name__ == "__main__":lists = [1, 2, 3]pool = Pool(processes=2) #定义最大的进程数pool.map(test, lists) #p必须是一个可迭代变量。pool.close()pool.join()
'''
1
2
3
'''
1.4、map_async(func,iterable [,chunksize [,callback [,error_callback ] ] ] )
map()返回结果对象的方法的变体。需要传入可迭代对象iterable
from multiprocessing import Pool
import time
def test(p):print(p)time.sleep(3)
if __name__=="__main__":pool = Pool(processes=2)# for i in range(500):# '''# (1)循环遍历,将500个子进程添加到进程池(相对父进程会阻塞)\n'# (2)每次执行2个子进程,等一个子进程执行完后,立马启动新的子进程。(相对父进程不阻塞)\n'# '''# pool.apply_async(test, args=(i,)) #维持执行的进程总数为10,当一个进程执行完后启动一个新进程.pool.map_async(test, range(500))print('test')pool.close()pool.join()'''
test
0
63
1
64
2
65
3
66
Process finished with exit code -1
'''
1.5、imap(func,iterable [,chunksize ] )
返回迭代器,next()调用返回的迭代器的方法得到结果,imap()方法有一个可选的超时参数: next(timeout)将提高multiprocessing.TimeoutError如果结果不能内退回超时秒。
1.6、close()
防止任何更多的任务被提交到池中。 一旦完成所有任务,工作进程将退出。
1.7、terminate()
立即停止工作进程而不完成未完成的工作。当池对象被垃圾收集时,terminate()将立即调用。
1.8、join()
等待工作进程退出。必须打电话close()或 terminate()使用之前join()。
from multiprocessing import Pool
import timedef f(x):return x*xif __name__ == '__main__':with Pool(processes=4) as pool: # start 4 worker processesresult = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single processprint(result.get(timeout=1)) # prints "100" unless your computer is *very* slowprint(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"it = pool.imap(f, range(10))print(next(it)) # prints "0"print(next(it)) # prints "1"print(it.next(timeout=1)) # prints "4" unless your computer is *very* slowresult = pool.apply_async(time.sleep, (10,))print(result.get(timeout=1)) # raises multiprocessing.TimeoutError
'''
100
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
0
1
4
Traceback (most recent call last):File "C:/Users/BruceWong/Desktop/develop/multiprocessingpool.py", line 19, in <module>print(next(res))
TypeError: 'MapResult' object is not an iteratorProcess finished with exit code 1
'''
【python】详解multiprocessing多进程-Pool进程池模块(二)相关推荐
- Python 多进程的进程池pool运行时报错:ValueError: Pool not running
本文仅供学习交流使用,如侵立删!demo下载见文末 Python 多进程的进程池pool运行时报错:ValueError: Pool not running def main(self, num):& ...
- 27 多进程之进程池Pool
在使用Python进行系统管理的时候,特别时同时操作多个文件目录,或者远程控制多态主机并行操作,可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process ...
- python—多进程之进程池
一.进程池 1.进程池定义: 进程池:可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该 ...
- linux多进程server 进程池_Python 中的进程池与多进程
封面图片来源:沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务,就开启多少个进程,实际上并不划算.由于计算机的 cpu 个数是非常有限的 ...
- 05 Python 并发编程(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- 详解线程锁、进程锁以及分布式锁,开发过程中解决的具体问题
聊聊线程锁.进程锁以及分布式锁 1. 线程锁-如何调度消费任务队列的线程池: 2. 进程锁-如何解决nginx惊群问题 3. 分布式锁-如何解决分布式系统中锁竞争问题 [Linux后端开发系列]详解线 ...
- python input与返回值-Python 详解基本语法_函数_返回值
Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令 ...
- python选择排序从大到小_经典排序算法和Python详解之(一)选择排序和二元选择排序...
本文源自微信公众号[Python编程和深度学习]原文链接:经典排序算法和Python详解之(一)选择排序和二元选择排序,欢迎扫码关注鸭! 扫它!扫它!扫它 排序算法是<数据结构与算法>中最 ...
- WindowsAPI详解——GetCurrentProcess 获得当前进程的句柄
WindowsAPI详解--GetCurrentProcess 获得当前进程的句柄 - [VC++编程] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://flyxxtt ...
最新文章
- 新手也能看懂的监控报警系统架构设计
- linux xargs 给命令传递参数 组合多个命令
- PC与手机的IPCP协商
- SQL SERVER数据库中 是否可以对视图进行修改删除
- C语言extern与static修饰变量
- 某储云商城系统源码V1.782 绿色版
- SpringBoot2.0之七 实现页面和后台代码的热部署
- 修复SQL Server 2016年Microsoft.AnalysisServices.AdomdClientUI.dll程序集错误的前4个选项
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
- JAVA API中文在线帮助文档
- 配天机器人——使用笔记
- html实现网页多人聊天,实现websocket多人聊天,很简单(示例代码)
- java坦克大战案例_JAVA实现经典坦克大战源代码
- 自学人工智能编程难吗?
- 做题总结——王母娘娘又双叒叕来难为茶山牛了
- 如何破译Charles
- AMR A级处理器排名
- QQ概念版试用体会(转)
- 药一点医疗器械管理系统——养护功能
- 【智能工厂】—走进MES项目
热门文章
- C++【STL】【string类的使用】
- 关闭455端口相关服务
- opencv的imwrite设置图片压缩率
- php 大转盘抽奖概率 角度,在线抽奖大转盘和概率计算
- 我用MOS管做开关管却不能关闭?
- selenium登录163邮箱,得到cookie,requests后续请求
- Holt-Winters方法预测水电发电量
- RuntimeError: mat1 and mat2 shapes cannot be multiplied (192x64 and 4x3)
- 怎样才能在微信朋友圈发长视频?
- 支付宝app支付提示 系统繁忙,请稍后重试