Pool类

在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间。如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十几个还好,但是如果上百个甚至更多,那手动去限制进程数量就显得特别的繁琐,此时进程池就派上用场了。 
Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。
下面介绍一下multiprocessing 模块下的Pool类下的几个方法

apply()

函数原型:

apply(func[, args=()[, kwds={}]])

该函数用于传递不定参数,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不在出现)。

apply_async()

函数原型:

apply_async(func[, args=()[, kwds={}[, callback=None]]])

与apply用法一样,但它是非阻塞且支持结果返回进行回调。

map()

函数原型:

map(func, iterable[, chunksize=None])

Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到返回结果。 
注意,虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。

close()

关闭进程池(pool),使其不在接受新的任务。

terminate()

结束工作进程,不在处理未处理的任务。

join()

主进程阻塞等待子进程的退出,join方法必须在close或terminate之后使用。

multiprocessing.Pool类的实例:

import time
from multiprocessing import Pool
def run(fn):#fn: 函数参数是数据列表的一个元素time.sleep(1)return fn*fnif __name__ == "__main__":testFL = [1,2,3,4,5,6]  print 'shunxu:' #顺序执行(也就是串行执行,单进程)s = time.time()for fn in testFL:run(fn)e1 = time.time()print "顺序执行时间:", int(e1 - s)print 'concurrent:' #创建多个进程,并行执行pool = Pool(5)  #创建拥有5个进程数量的进程池#testFL:要处理的数据列表,run:处理testFL列表中数据的函数rl =pool.map(run, testFL) pool.close()#关闭进程池,不再接受新的进程pool.join()#主进程阻塞等待子进程的退出e2 = time.time()print "并行执行时间:", int(e2-e1)print rl

执行结果:

shunxu:
顺序执行时间: 6
concurrent:
并行执行时间: 2
[1, 4, 9, 16, 25, 36]

上例是一个创建多个进程并发处理与顺序执行处理同一数据,所用时间的差别。从结果可以看出,并发执行的时间明显比顺序执行要快很多,但是进程是要耗资源的,所以平时工作中,进程数也不能开太大。 
程序中的r1表示全部进程执行结束后全局的返回结果集,run函数有返回值,所以一个进程对应一个返回结果,这个结果存在一个列表中,也就是一个结果堆中,实际上是用了队列的原理,等待所有进程都执行完毕,就返回这个列表(列表的顺序不定)。 
对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),让其不再接受新的Process了。

再看一个实例:

import time
from multiprocessing import Pool
def run(fn) :time.sleep(2)print fn
if __name__ == "__main__" :startTime = time.time()testFL = [1,2,3,4,5]pool = Pool(10)#可以同时跑10个进程pool.map(run,testFL)pool.close()pool.join()  endTime = time.time()print "time :", endTime - startTime

执行结果:

213
4
5
time : 2.51999998093

再次执行结果如下:

1
342
5
time : 2.48600006104

结果中为什么还有空行和没有折行的数据呢?其实这跟进程调度有关,当有多个进程并行执行时,每个进程得到的时间片时间不一样,哪个进程接受哪个请求以及执行完成时间都是不定的,所以会出现输出乱序的情况。那为什么又会有没这行和空行的情况呢?因为有可能在执行第一个进程时,刚要打印换行符时,切换到另一个进程,这样就极有可能两个数字打印到同一行,并且再次切换回第一个进程时会打印一个换行符,所以就会出现空行的情况。

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,10几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,这时候进程池Pool发挥作用的时候就到了。
      Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。这里有一个简单的例子:

#!/usr/bin/env python
#coding=utf-8
"""
Author: Squall
Last modified: 2011-10-18 16:50
Filename: pool.py
Description: a simple sample for pool class
"""from multiprocessing import Pool
from time import sleepdef f(x):for i in range(10):print '%s --- %s ' % (i, x)sleep(1)
def main():pool = Pool(processes=3)    # set the processes max number 3for i in range(11,20):result = pool.apply_async(f, (i,))pool.close()pool.join()if result.successful():print 'successful'
if __name__ == "__main__":main()

先创建容量为3的进程池,然后将f(i)依次传递给它,运行脚本后利用ps aux | grep pool.py查看进程情况,会发现最多只会有三个进程执行。pool.apply_async()用来向进程池提交目标请求,pool.join()是用来等待进程池中的worker进程执行完毕,防止主进程在worker进程结束前结束。但必pool.join()必须使用在pool.close()或者pool.terminate()之后。其中close()跟terminate()的区别在于close()会等待池中的worker进程执行结束再关闭pool,而terminate()则是直接关闭。result.successful()表示整个调用执行的状态,如果还有worker没有执行完,则会抛出AssertionError异常。
      利用multiprocessing下的Pool可以很方便的同时自动处理几百或者上千个并行操作,脚本的复杂性也大大降低。

python 进程池相关推荐

  1. python的用途实例-python进程池作用展示及实例解析

    在以下的文章之中我们来了解一下什么是python中的进程池.了解一下python进程池的相关知识,以及进程池在python编程之中能起到什么样的作用. 进程池 Pool类描述了一个工作进程池,他有几种 ...

  2. python进程池调用实例方法_Python进程池Pool应用实例分析

    本文实例讲述了Python进程池Pool应用.分享给大家供大家参考,具体如下: 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百 ...

  3. Python 进程池 multiprocessing.Pool - Python零基础入门教程

    目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...

  4. python进程池和线程池_python自带的进程池及线程池

    进程池 """ python自带的进程池 """ from multiprocessing import Pool from time im ...

  5. python进程池的使用

    python进程池 import os from multiprocessing import Pool import timea = 1 def task(name):global afor i i ...

  6. python进程池与线程池

    文章目录 python进程池与线程池 思考 简介 进程池与线程池基本使用 concurrent.futures 介绍 基本方法 使用示例 python进程池与线程池 思考 能否无限制的开设进程或者线程 ...

  7. python 进程池 等待数量_python 进程池multiprocessing.Pool

    44.Python 进程池multiprocessing.Pool 最后更新于:2020-03-21 11:53:37 python进程池Pool 和前面讲解的python线程池 类似,虽然使用多进程 ...

  8. Python进程池及自定义进程

    Python进程池及自定义进程 微信关注公众号:夜寒信息 致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!     这次给大家分享Python的进程池及自定义进程,由于Python基础已 ...

  9. Python 进程池共享数据

    Python 进程池共享数据 解决进程池间全局变量不关联问题 from concurrent.futures import ProcessPoolExecutor import multiproces ...

  10. python 进程池使用

    python进程池 # Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None)# 函数返回一个进程池(Po ...

最新文章

  1. Java处理高并发、高负载类网站的优化方法
  2. 【转载】 C# 中的Async 和 Await 的用法详解
  3. 在Dubbo中使用高效的Java序列化(Kryo和FST)
  4. 信息检索及DM必备知识总结:luncene
  5. 通过简单的 ResourceManager 管理 XNA 中的资源,WPXNA(二)
  6. html文字简单动画效果,CSS3一个简单的按钮悬停波浪文本动画效果
  7. LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序
  8. python处理中文字符串_处理python字符串中的中文字符
  9. C#常用类库----CSV文件操作类
  10. 从字节码层面,解析 Java 布尔型的实现原理
  11. MySQL数据库基础(三)——SQL语言
  12. html中引入字体包
  13. 谷歌浏览器打开普通用户_谷歌浏览器为啥打开之后会是其他的浏览器的解决步骤...
  14. php清除手机浏览器缓存,js清除浏览器缓存的几种方法
  15. texture_laws 纹理滤波用于缺陷检测
  16. IPv6安装及使用手册
  17. 2023年2022年Cfa一级考纲变化分析
  18. TP简约自适应导航网站源码
  19. 人工智能如何影响社会经济
  20. OPPO R11完美助攻,男友这样拍照你会更开心

热门文章

  1. 高通量数据中批次效应的鉴定和处理(一)
  2. 代码分析 | 单细胞转录组Normalization详解
  3. tomcat6的项目能直接在tomcat7上用吗_极尽人性化的设计: 能“隐形”的笔记本电脑支架...
  4. NOI数学之提高级:线性方程组的高斯消元法
  5. 洛谷 数论入门相关题目--2022.01.22
  6. 1.4编程基础之逻辑表达式与条件分支 07 收集瓶盖赢大奖
  7. 重理工c语言实验指导书,太原理工大学级c语言实验指导书参考答案教程方案.docx...
  8. redis 图片2进制保存_Redis数据结构底层的SDS了解吗
  9. STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断
  10. springboot日志按照天自动输出_SpringBoot使用logback实现日志按天滚动-阿里云开发者社区...