Python-Pool类
目录:
- multiprocessing模块
- Pool类
- apply
- apply_async
- map
- close
- terminate
- join
- 进程实例
multiprocessing模块
如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。multiprocessing模块提供了一个Process类来代表一个进程对象,这个模块表示像线程一样管理进程,这个是multiprocessing的核心,它与threading很相似,对多核CPU的利用率会比threading好的多。
看一下Process类的构造方法:
__init__(self, group=None, target=None, name=None, args=(), kwargs={})
参数说明:
group:进程所属组。基本不用
target:表示调用对象。
args:表示调用对象的位置参数元组。
name:别名
kwargs:表示调用对象的字典。
下面看一个简单的例子

1 #coding=utf-8
2 import multiprocessing
3
4 def do(n) :
5 #获取当前线程的名字
6 name = multiprocessing.current_process().name
7 print(name,'starting')
8 print("worker ", n)
9 return
10
11 if __name__ == '__main__' :
12 numList = []
13 for i in xrange(5) :
14 p = multiprocessing.Process(target=do, args=(i,))
15 numList.append(p)
16 p.start()
17 p.join()
18 print("Process end.")

运行结果

Process-1 starting
worker 0
Process end.
Process-2 starting
worker 1
Process end.
Process-3 starting
worker 2
Process end.
Process-4 starting
worker 3
Process end.
Process-5 starting
worker 4
Process end.

创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,并用其start()方法启动,这样创建进程比fork()还要简单。 join()方法表示等待子进程结束以后再继续往下运行,通常用于进程间的同步。
注意:
在Windows上要想使用进程模块,就必须把有关进程的代码写在当前.py文件的if __name__ == ‘__main__’ :语句的下面,才能正常使用Windows下的进程模块。Unix/Linux下则不需要。
Pool类
Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。
下面介绍一下multiprocessing 模块下的Pool类下的几个方法:
1.apply()
函数原型:apply(func[, args=()[, kwds={}]])
该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不在出现)。
2.apply_async
函数原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])
与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。
3.map()
函数原型:map(func, iterable[, chunksize=None])
Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回。
注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。
4.map_async()
函数原型:map_async(func, iterable[, chunksize[, callback]])
与map用法一致,但是它是非阻塞的。其有关事项见apply_async。
5.close()
关闭进程池(pool),使其不在接受新的任务。
6.terminal()
结束工作进程,不在处理未处理的任务。
7.join()
主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。
下面我们看一个简单的multiprocessing.Pool类的实例:

1 # -*- coding: utf-8 -*-
2 import time
3 from multiprocessing import Pool
4 def run(fn):
5 #fn: 函数参数是数据列表的一个元素
6 time.sleep(1)
7 print(fn*fn)
8
9 if __name__ == "__main__":
10 testFL = [1,2,3,4,5,6]
11 print ('shunxu:') #顺序执行(也就是串行执行,单进程)
12 s = time.time()
13 for fn in testFL:
14 run(fn)
15 t1 = time.time()
16 print ("顺序执行时间:", int(t1 - s))
17
18 print ('concurrent:') #创建多个进程,并行执行
19 pool = Pool(10) #创建拥有10个进程数量的进程池
20 #testFL:要处理的数据列表,run:处理testFL列表中数据的函数
21 pool.map(run, testFL)
22 pool.close()#关闭进程池,不再接受新的进程
23 pool.join()#主进程阻塞等待子进程的退出
24 t2 = time.time()
25 print ("并行执行时间:", int(t2-t1))

输出结果为:

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

上例是一个创建多个进程并发处理与顺序执行处理同一数据,所用时间的差别。从结果可以看出,并发执行的时间明显比顺序执行要快很多,但是进程是要耗资源的,所以平时工作中,进程数也不能开太大。 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),让其不再接受新的Process了。
更多有关进程介绍请参考官方文档:https://docs.python.org/2/library/multiprocessing.html
Python-Pool类的更多相关文章
- Python多进程库multiprocessing中进程池Pool类的使用
问题起因 最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似ba ...
- Python多进程库multiprocessing中进程池Pool类的使用[转]
from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...
- Python multiprocessing模块的Pool类来代表进程池对象
#-*-coding:utf-8-*- '''multiprocessing模块提供了一个Pool类来代表进程池对象 1.Pool可以提供指定数量的进程供用户调用,默认大小是CPU的核心数: 2.当有 ...
- Python多进程库multiprocessing创建进程以及进程池Pool类的使用
问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...
- Python 多进程 multiprocessing.Pool类详解
Python 多进程 multiprocessing.Pool类详解 https://blog.csdn.net/SeeTheWorld518/article/details/49639651
- Process类,Thread类,Pool类,gevent类,ProcessPoolExecutor,ThreadPoolExecutor的用法比较
一 Process类 multiprocessing模块下的一个类 创建子进程. 有两种方法 方法一 from multiprocessing import Process import os def ...
- python:类1——类和对象基础
一.OO = Object Oriented 面向对象 OOP面向对象编程.OOA面向对象分析.OOD面向对象设计 二.属性+方法——>类(数据和函数) class Turtle(): #类名约 ...
- Python - 关于类(self/cls) 以及 多进程通讯的思考
Python-多进程中关于类以及类实例的一些思考 目录 Python-多进程中关于类以及类实例的一些思考 1. 背景 2. Python 类中的函数 - staticmethod / classmet ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 【python】类中的self
在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...
随机推荐
- IIS Express URL Rewrite无效
点击一下项目,再选择属性选项卡(不是右键属性) 如上图,如果托管管道模式是集成的话,改为经典即可.如果在vs2010的 WebDev.WebServer40方式启动 默认就是经典模式
- ASP.NET MVC 5 笔记
1. MVC 的常用特性 1) System.Web.Mvc.ActionNameAttribute Ø 该特性用于将当前 Action 名称,改为一个指定的 Action 名称,路由匹配时 ...
- [译]MediatR, FluentValidation, and Ninject using Decorators
原文 CQRS 我是CQRS模式的粉丝.对我来说CQRS能让我有更优雅的实现.它同样也有一些缺点:通常需要更多的类,workflow不总是清晰的. MediatR MediatR的文档非常不错,在这就 ...
- mybatis-configxml样板
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC & ...
- 【51nod 1191】消灭兔子
Description 有N只兔子,每只有一个血量B[i],需要用箭杀死免子.有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D[i],价格为P[i](1 <= i <= M).假设 ...
- oracle rman备份
rman 登录到cmd 打开cmd 输入 rman connect target jhpt/1@orcl C:\Documents and Settings\Administrator>rman ...
- python后端将svc文件数据读入数据库具体实现
如何用python将svc文件的数据读入到MySQL数据库里,在此直接上代码了,感兴趣的朋友可以贴代码测试: import pandas as pd import os from sqlalchemy ...
- valgrind 开发板调试
1.http://www.360doc.com/content/13/1205/13/7256015_334661588.shtml
- python(十一)面向切面编程AOP和装饰器
二.装饰器 装饰器可以在给函数修改功能的同时并不改变这个函数本身.(以下用的都是python2.7) 首先,在python里面函数是对象,在下面的函数里"fun"是函数也是对象可以 ...
- valueForKeyPath用途
可能大家对- (id)valueForKeyPath:(NSString *)keyPath方法不是很了解. 其实这个方法非常的强大,举个例子: NSArray *array = @[@"n ...