python 进程池 freeze_support_Python 多进程并发操作中进程池Pool的实例
在利用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):
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()
"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的实例相关推荐
- python进程池调用实例方法_Python 多进程并发操作中进程池Pool的实例
在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process ...
- python 多进程 每个进程做不同功能实例_Python 多进程并发操作中进程池Pool的实例...
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python 多进程并发(进程池)
前言 最近在处理大数据相关的东西,数据动辄上百万,还不能用 GPU 加速,于是开始动起了多进程的念头.众所周知,Python 的多线程是假的,不过好在开发者老大还是给我们留了一个活路,也就是进程池.这 ...
- C语言并发执行的进程怎么写,多进程并发写文件 多进程并发售票 用c语言写
tcp多进程并发文件服务器代码? 线程是相对独立的执行单位,是计算机系统进行调度的最小单位,其切换由操作系统控制,称之为短作业调度.换句话说您没有任何必要去手动调度线程.如果您想要实现的是连接分配的话 ...
- python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...
- java设计高并发内存池_高并发服务器-连接池的设计
高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...
- 爬虫-python -(8) 多线程与多进程操作以及线程池 异步操作
文章目录 1.通过异步操作提高爬虫效率 2.多线程 3.多进程 4.线程池与进程池 5.线程池实例-新发地菜价保存 6.总结 1.通过异步操作提高爬虫效率 一般爬虫过程为,请求网页-响应请求-从响应中 ...
- linux多进程server 进程池_Python 中的进程池与多进程
封面图片来源:沙沙野 内容概览 进程池 进程池和多进程的性能测试 进程池的其他机制 进程池的回调函数 进程池 如果有多少个任务,就开启多少个进程,实际上并不划算.由于计算机的 cpu 个数是非常有限的 ...
- 操作系统——2.并发与进程
文章目录 第二章 并发与进程 2.1 进程的概念 2.2 操作系统为控制程序所建立的数据结构 2.3 操作系统对进程的控制 2.4 线程 2.5 进程调度 2.6 实时系统与实时任务调度 2.7 并发 ...
最新文章
- Springboot 中 Mybatis 的使用
- 看了两篇园子里的文章,初步懂了点接口的涵义
- laravel(二):laravel基本入门 看到Hello Laravel
- 网易云信集成视频教程(三):如何通过SDK实现自定义消息?
- alpha值计算 qcolor_量化交易与机器学习(四):如何研究alpha因子
- (125)FPGA面试题-熟悉AXI总线吗,介绍AXI
- python flask框架 蓝图的使用
- mysql设置远程访问的权限
- spring catch了异常还是回滚了_干货:Spring 踩坑之@Transactional 神奇失效
- 自己动手破解斯凯Mrp游戏
- 热式气体质量流量计检定规程_新品发布:西尼尔ST51/54热式质量流量计
- JS脚本实现浏览器自动点击(阿里员工秒杀月饼)
- element ui表单必填_详解element-ui设置下拉选择切换必填和非必填
- keil软件是干嘛的?keil软件怎么用?
- 三轴加速度传感器角度值转换原理
- 推荐系统三十六式(刑无刀)学习笔记(二)
- 【工具】windows--word转PDF
- 支持向量机 一 :线性支持向量机介绍
- Excel设置背景页码
- 七阶拉丁方阵_拉丁方阵【转】