python进程池:multiprocessing.pool

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

 

回到顶部

例1:使用进程池

复制代码
#coding: utf-8
import multiprocessing
import timedef func(msg):print "msg:", msgtime.sleep(3)print "end"if __name__ == "__main__":pool = multiprocessing.Pool(processes = 3)for i in xrange(4):msg = "hello %d" %(i)pool.apply_async(func, (msg, ))   #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"pool.close()pool.join()   #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print "Sub-process(es) done."
复制代码

一次执行结果

1
2
3
4
5
6
7
8
9
10
mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~ello 0
msg: hello 1
msg: hello 2
end
msg: hello 3
end
end
end
Sub-process(es) done.

函数解释

  • apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞,apply(func[, args[, kwds]])是阻塞的(理解区别,看例1例2结果区别)
  • close()    关闭pool,使其不在接受新的任务。
  • terminate()    结束工作进程,不在处理未完成的任务。
  • join()    主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用。

执行说明:创建一个进程池pool,并设定进程的数量为3,xrange(4)会相继产生四个对象[0, 1, 2, 4],四个对象被提交到pool中,因pool指定进程数为3,所以0、1、2会直接送到进程中执行,当其中一个执行完事后才空出一个进程处理对象3,所以会出现输出“msg: hello 3”出现在"end"后。因为为非阻塞,主函数会自己执行自个的,不搭理进程的执行,所以运行完for循环后直接输出“mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~”,主程序在pool.join()处等待各个进程的结束。

回到顶部

例2:使用进程池(阻塞)

复制代码
#coding: utf-8
import multiprocessing
import timedef func(msg):print "msg:", msgtime.sleep(3)print "end"if __name__ == "__main__":pool = multiprocessing.Pool(processes = 3)for i in xrange(4):msg = "hello %d" %(i)pool.apply(func, (msg, ))   #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"pool.close()pool.join()   #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print "Sub-process(es) done."
复制代码

一次执行的结果

1
2
3
4
5
6
7
8
9
10
msg: hello 0
end
msg: hello 1
end
msg: hello 2
end
msg: hello 3
end
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done. 
回到顶部

例3:使用进程池,并关注结果

复制代码
import multiprocessing
import timedef func(msg):print "msg:", msgtime.sleep(3)print "end"return "done" + msgif __name__ == "__main__":pool = multiprocessing.Pool(processes=4)result = []for i in xrange(3):msg = "hello %d" %(i)result.append(pool.apply_async(func, (msg, )))pool.close()pool.join()for res in result:print ":::", res.get()print "Sub-process(es) done."
复制代码

一次执行结果

1
2
3
4
5
6
7
8
9
10
msg: hello 0
msg: hello 1
msg: hello 2
end
end
end
::: donehello 0
::: donehello 1
::: donehello 2
Sub-process(es) done.

 :get()函数得出每个返回结果的值

回到顶部

例4:使用多个进程池

复制代码
#coding: utf-8
import multiprocessing
import os, time, randomdef Lee():print "\nRun task Lee-%s" %(os.getpid()) #os.getpid()获取当前的进程的IDstart = time.time()time.sleep(random.random() * 10) #random.random()随机生成0-1之间的小数end = time.time()print 'Task Lee, runs %0.2f seconds.' %(end - start)def Marlon():print "\nRun task Marlon-%s" %(os.getpid())start = time.time()time.sleep(random.random() * 40)end=time.time()print 'Task Marlon runs %0.2f seconds.' %(end - start)def Allen():print "\nRun task Allen-%s" %(os.getpid())start = time.time()time.sleep(random.random() * 30)end = time.time()print 'Task Allen runs %0.2f seconds.' %(end - start)def Frank():print "\nRun task Frank-%s" %(os.getpid())start = time.time()time.sleep(random.random() * 20)end = time.time()print 'Task Frank runs %0.2f seconds.' %(end - start)if __name__=='__main__':function_list=  [Lee, Marlon, Allen, Frank] print "parent process %s" %(os.getpid())pool=multiprocessing.Pool(4)for func in function_list:pool.apply_async(func)     #Pool执行函数,apply执行函数,当有一个进程执行完毕后,会添加一个新的进程到pool中print 'Waiting for all subprocesses done...'pool.close()pool.join()    #调用join之前,一定要先调用close() 函数,否则会出错, close()执行后不会有新的进程加入到pool,join函数等待素有子进程结束print 'All subprocesses done.'
复制代码

一次执行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
parent process 7704
Waiting for all subprocesses done...
Run task Lee-6948
Run task Marlon-2896
Run task Allen-7304
Run task Frank-3052
Task Lee, runs 1.59 seconds.
Task Marlon runs 8.48 seconds.
Task Frank runs 15.68 seconds.
Task Allen runs 18.08 seconds.
All subprocesses done.

 

multiprocessing pool map

复制代码
#coding: utf-8
import multiprocessing def m1(x): print x * x if __name__ == '__main__': pool = multiprocessing.Pool(multiprocessing.cpu_count()) i_list = range(8)pool.map(m1, i_list)
复制代码

一次执行结果

1
2
3
4
5
6
7
8
0
1
4
9
16
25
36
49

 参考:http://www.dotblogs.com.tw/rickyteng/archive/2012/02/20/69635.aspx 

 

问题:http://bbs.chinaunix.net/thread-4111379-1-1.html

复制代码
#coding: utf-8
import multiprocessing
import loggingdef create_logger(i):print iclass CreateLogger(object):def __init__(self, func):self.func = funcif __name__ == '__main__':ilist = range(10)cl = CreateLogger(create_logger)pool = multiprocessing.Pool(multiprocessing.cpu_count())pool.map(cl.func, ilist)print "hello------------>"
复制代码

一次执行结果

1
2
3
4
5
6
7
8
9
10
11
0
1
2
3
4
5
6
7
8
9
hello------------>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse juno_放弃Eclipse Juno

eclipse juno在上一个博客中,我发布了有关Eclipse 4.2 Juno设置的信息。 在需要重新安装其他东西的情况下,为我提供了很多参考。 那时我没有谈论的是我与Juno共同遇到的问题。 我以为这是我自己的安装程序,很麻烦,但是此后并没有太…

C语言结构体数组的使用

1、结构体数组的优点结构体可以存储不同的数据类型,将他们互相联系起来。结构体数组可以连续存储多个结构体,和数组作用相似。比如想定义同一个最小外接矩形的四个坐标值,并给予这个矩形一个特征编号。当需要存储多个最小外接矩形的信息时&am…

arthas 查看哪个方法调用最耗时_Java开源诊断工具Arthas使用方法详解

一、前言1、热更新代码的场景(1)当线上服务器出现问题时,有些时候现有的手段不足以发现问题所在,可能需要追加打印日志或者增加一些调试代码,如果我们去改代码重新部署,会破坏问题现场,可以通过热部署的手段来增加调试…

Java 12 - Java StringBuffer和StringBuilder类

Java StringBuffer和StringBuilder类 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。 和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。 StringBuilder类在Java 5中…

将你的Vim 打造成轻巧强大的IDE

Vim和Emacs一个称为神之编辑器一个被称为编辑器之神,固然很是夸张,但也足以说明这两 款软件的优秀和在程序员界的地位。但是它们都已漫长的学习曲线让人望而生畏,阻止了大 多数人进入。作为一名几乎完全使用Vim写各种代码、文档的人&#xff…

NutchServer的安全层

我曾作为GSoC 2016项目在Apache Nutch的NutchServer的Security Layer上工作,并完成了它。 在此博客文章中,我将解释其工作原理和使用方法。 首先,建议您阅读以前有关GSoC 2016接受的帖子: http ://furkankamaci.com/gsoc-2016-acc…

借助opencv将unsigned char数组显示为图像

在用C或者C做图像处理程序时,经常需要把结果图显示出来看看效果,这时候可以借助opencv的Mat类型,如下:Mat gray1_mat(rect_height, rect_width, CV_8UC1, minsrc);//为了显示图片 先改为mat类型imshow("去雾图像显示", …

眼图观测实验报告_眼图观察测量实验

实验12眼图观察测量实验一、实验目的1.学会观察眼图及其分析方法,调整传输滤波器特性。二、实验仪器1.眼图观察电路(底板右下侧)2.时钟与基带数据发生模块,位号:G 3.噪声模块,位号E 4.100M双踪示…

C、C++申请指针内存的问题

关于指针的血和泪的教训 1、指针申请时一定要检查是否申请成功,当项目比较庞大时,内存有可能申请不成功导致程序中断,而这时候往往无从知道哪里出现了问题。如下:double* wid (double*)malloc((num1) *sizeof(double));//存储每个…

invalid use of null value

给mysql的数据表的一个字段插入数据,不成功, 然后在数据表设计中,把不是null勾选上,又提示 invalid use of null value 这种情况比较尴尬 只能删掉这一个字段,然后新建一个同样名字的字段,然后直接勾选不是null然后在保存就行了 转载于:https://www.cnblogs.com/jnhs/p/1008253…

android 13.0 Launcher3定制folder文件夹16宫格实现二

1. 概述 在13.0的系统产品rom定制化开发中,对于Launcher3的定制功能也是不少的,比如在Launcher3中添加默认文件夹,把默认的app添加的文件夹里面,其他的app 然后按顺序排序。在文件夹布局就是默认的16宫格布局,接下来分析下相关源码来实现功能 2.Launcher3定制化之修改添…

vim配置及插件安装管理(超级详细)

1写在前面 Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用的IDE是何等的重要啊, 估计很多人就是卡在这个门槛上了, "工欲善其事, 必先利其器"嘛, 我想如果有一…

vue 父链和子组件索引_vue子组件和父组件双向绑定的几种方案

v-model案例模仿v-model实现案例我是一串要和内部名字联动的一串文字(父组件)父组件改变值带动(父组件)点一下试试.sync方案实现案例这是父组件的东西。利用这个框改变值,看看有没有传到子组件,也可以改子组件看看这里有变化没// v-model方案 你写上一个…

程序逻辑上多一些提示

写程序时要想下各种可能出错的情况&#xff0c;提前给出错误提示&#xff0c;项目大了就可以比较容易找错误。 比如&#xff0c;当特征点个数小于4时不能计算单应矩阵&#xff0c;所以当个数小于4时先输出提示&#xff1a; if (matchePoints.size()>10)for (int i 0; i<…

安卓清理垃圾清理代码_用方面清理代码

安卓清理垃圾清理代码在我以前的文章中&#xff0c;我描述了字母转换&#xff0c;并且提到了我们使用AspectJ来解决该任务&#xff0c;但是我没有提及AspectJ的工作原理和一般性方面。 因此&#xff0c;在接下来的几行中&#xff0c;我将解释&#xff1a; 什么是面向方面的编程…

最大功率点跟踪_ADI公司推出集成最大功率点跟踪和I2C的80V降压升压电池充电控制器...

中国&#xff0c;北京 – Analog Devices, Inc. (ADI)&#xff0c;今日宣布推出LT8491降压-升压电池充电控制器&#xff0c;该控制器具有最大功率点跟踪(MPPT)、温度补偿和I2C接口等特性&#xff0c;适用于遥测和控制。该器件的工作电压可高于、低于或等于经调节的电池浮充电压…

VIM 编码配置

在 Vim 中&#xff0c;有四个与编码有关的选项&#xff0c;它们是&#xff1a;fileencodings、fileencoding、encoding 和 termencoding。在实际使用中&#xff0c;任何一个选项出现错误&#xff0c;都会导致出现乱码。因此&#xff0c;每一个 Vim 用户都应该明确这四个选项的含…

关于摄像头的一些零碎知识

项目上需要用到读取摄像头的帧数据&#xff0c;在对视频帧做算法处理。简单了解了一下摄像头的分类和如何读取。 1、总体上来说&#xff0c;在win平台下面摄像头数据采集无外乎两种方式vfw和direct show。其中vfw是不依赖于sdk的&#xff0c;只要有系统api即可实现摄像头数据的…

MQTT和Java入门

MQTT&#xff08;MQ遥测传输&#xff09;是一种轻量级的发布/订阅消息传递协议。 MQTT在物联网应用程序中得到了广泛使用&#xff0c;因为它被设计为在占用空间小的系统上运行在远程位置。 MQTT 3.1是OASIS标准&#xff0c;您可以在http://mqtt.org/上找到所有信息。 本文将指…

函数的命名空间

# 函数进阶 # a 1 # def func(): # print(a) # func()# 命名空间和作用域 # print() # input() # list # tuple#命名空间 有三种 #内置命名空间 —— python解释器# 就是python解释器一启动就可以使用的名字存储在内置命名空间中# 内置的名字在启动解释器的时候被加载进内…