在利用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 sleep

def 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 3

for 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多进程并发(multiprocessing)

由于Python设计的限制(我说的是咱们常用的CPython)。最多只能用满1个CPU核心。

Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。

1、新建单一进程

如果我们新建少量进程,可以如下:

import multiprocessing

import time

def func(msg):

for i in xrange(3):

print msg

time.sleep(1)

if __name__ == "__main__":

p = multiprocessing.Process(target=func, args=("hello", ))

p.start()

p.join()

print "Sub-process done."

2、使用进程池

是的,你没有看错,不是线程池。它可以让你跑满多核CPU,而且使用方法非常简单。

注意要用apply_async,如果落下async,就变成阻塞版本了。

processes=4是最多并发进程数量。

import

multiprocessing

import

time

def

func(msg):

for

i

in

xrange(3):

print

msg

time.sleep(1)

if

__name__

==

"__main__":

pool

=

multiprocessing.Pool(processes=4)

for

i

in

xrange(10):

msg

=

"hello

%d"

%(i)

pool.apply_async(func,

(msg,

))

pool.close()

pool.join()

print

"Sub-process(es)

done."

3、使用Pool,并需要关注结果

更多的时候,我们不仅需要多进程执行,还需要关注每个进程的执行结果,如下:

import multiprocessing

import time

def func(msg):

for i in xrange(3):

print msg

time.sleep(1)

return "done " + msg

if __name__ == "__main__":

pool = multiprocessing.Pool(processes=4)

result = []

for i in xrange(10):

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."

2014.12.25更新

根据网友评论中的反馈,在Windows下运行有可能崩溃(开启了一大堆新窗口、进程),可以通过如下调用来解决:

multiprocessing.freeze_support()

简易worker multiprocessing.Pool

多任务模型设计是一个比较复杂的逻辑,但是python对于多任务的处理却有种种方便的类库,不需要过多的纠结进程/线程间的操作细节。比如multiprocessing.Pool就是其中之一。

官方给的范例也很简单。

from multiprocessing import Pool

def f(x):

return x*x

if __name__ == '__main__':

pool = Pool(processes=4) # start 4 worker processes

result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously

print result.get(timeout=1) # prints "100" unless your computer is *very* slow

print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]"

并未做太多的详细解释。正好我手头有一段代码,需要请求几百个url,解析html页面获取一些信息,单线程for循环效率极低,因此看到了这个模块,想用这个实现多任务分析,参考代码如下:

from multiprocessing import Pool

def analyse_url(url):

#do something with this url

return analysis_result

if __name__ == '__main__':

pool = Pool(processes=10)

result = pool.map(analyse_url, url_list)

确实比以前单线程for循环url_list列表,一个个请求analyse_url要快得多,但是带来的问题就是一旦pool.map没执行完就ctrl-c中断程序,程序就会异常,永远无法退出,参考stackoverflow的这个帖子,修改为以下代码:

#result = pool.map(analyse_url, url_list)

result = pool.map_async(analyse_url, url_list).get(120)

至此问题完美解决。

以上这篇Python 多进程并发操作中进程池Pool的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

python 进程池 freeze_support_Python 多进程并发操作中进程池Pool的实例相关推荐

  1. python进程池调用实例方法_Python 多进程并发操作中进程池Pool的实例

    在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process ...

  2. python 多进程 每个进程做不同功能实例_Python 多进程并发操作中进程池Pool的实例...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. python 多进程并发(进程池)

    前言 最近在处理大数据相关的东西,数据动辄上百万,还不能用 GPU 加速,于是开始动起了多进程的念头.众所周知,Python 的多线程是假的,不过好在开发者老大还是给我们留了一个活路,也就是进程池.这 ...

  4. C语言并发执行的进程怎么写,多进程并发写文件 多进程并发售票 用c语言写

    tcp多进程并发文件服务器代码? 线程是相对独立的执行单位,是计算机系统进行调度的最小单位,其切换由操作系统控制,称之为短作业调度.换句话说您没有任何必要去手动调度线程.如果您想要实现的是连接分配的话 ...

  5. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...

  6. java设计高并发内存池_高并发服务器-连接池的设计

    高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...

  7. 爬虫-python -(8) 多线程与多进程操作以及线程池 异步操作

    文章目录 1.通过异步操作提高爬虫效率 2.多线程 3.多进程 4.线程池与进程池 5.线程池实例-新发地菜价保存 6.总结 1.通过异步操作提高爬虫效率 一般爬虫过程为,请求网页-响应请求-从响应中 ...

  8. linux多进程server 进程池_Python 中的进程池与多进程

    封面图片来源:沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务,就开启多少个进程,实际上并不划算.由于计算机的 cpu 个数是非常有限的 ...

  9. 操作系统——2.并发与进程

    文章目录 第二章 并发与进程 2.1 进程的概念 2.2 操作系统为控制程序所建立的数据结构 2.3 操作系统对进程的控制 2.4 线程 2.5 进程调度 2.6 实时系统与实时任务调度 2.7 并发 ...

最新文章

  1. Springboot 中 Mybatis 的使用
  2. 看了两篇园子里的文章,初步懂了点接口的涵义
  3. laravel(二):laravel基本入门 看到Hello Laravel
  4. 网易云信集成视频教程(三):如何通过SDK实现自定义消息?
  5. alpha值计算 qcolor_量化交易与机器学习(四):如何研究alpha因子
  6. (125)FPGA面试题-熟悉AXI总线吗,介绍AXI
  7. python flask框架 蓝图的使用
  8. mysql设置远程访问的权限
  9. spring catch了异常还是回滚了_干货:Spring 踩坑之@Transactional 神奇失效
  10. 自己动手破解斯凯Mrp游戏
  11. 热式气体质量流量计检定规程_新品发布:西尼尔ST51/54热式质量流量计
  12. JS脚本实现浏览器自动点击(阿里员工秒杀月饼)
  13. element ui表单必填_详解element-ui设置下拉选择切换必填和非必填
  14. keil软件是干嘛的?keil软件怎么用?
  15. 三轴加速度传感器角度值转换原理
  16. 推荐系统三十六式(刑无刀)学习笔记(二)
  17. 【工具】windows--word转PDF
  18. 支持向量机 一 :线性支持向量机介绍
  19. Excel设置背景页码
  20. 七阶拉丁方阵_拉丁方阵【转】

热门文章

  1. 路由和交换机工作原理
  2. Python maketrans() 方法
  3. 我的JavaScript学习笔记
  4. 在bootstrap ace样式框架上修改的后台管理型模板(Tab页后台管理模板)
  5. 为图片添加半透明遮罩效果
  6. php安装pear和phpunit
  7. 关于成功的因素-----谨记
  8. 30个精美的模板,贺卡,图形圣诞素材
  9. OpenCV 【二十】给图像添加边界
  10. 深入理解PHP之OpCode