我们在使用Python时,会经常需要使用多进程/多线程的情况,以便提高程序的运行效率,尤其是跟网络进行交互,如使用爬虫时。下面我们将简单看下Python的进程池的创建,map()、apply_async()、apply()的使用。

Pool

  可以创建一个进程池,里面是一些工作者进程(Workers),向其提交任务。

创建

class multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]]

  • processes:工作进程的数量,如果为None那么processes的值为os.cpu_count()返回的数量,即CPU的个数。
  • initializer: 如果initializer是None,那么每一个工作进程在开始的时候会调用initializer(*initargs)。
  • maxtasksperchild:工作进程退出之前可以完成的任务数,完成后用一个新的工作进程来替代原进程,来让闲置的资源被释放。maxtasksperchild默认是None,意味着只要Pool存在工作进程就会一直存活。
  • context:用在制定工作进程启动时的上下文,一般使用 multiprocessing.Pool() 或者一个context对象的Pool()方法来创建一个池,两种方法都适当的设置了context。

成员函数

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

map

map(funciterable[, chunksize])  

  这种方法将iterable对象分成一些块,作为单独的任务提交给进程池。 这些块的(近似)大小可以通过将chunksize设置为正整数来指定。

Sample:

#!/usr/bin/env python
# -*- coding:utf-8 -*- from multiprocessing import Pool
import time def test(i):
print i
time.sleep(1) if __name__ == '__main__':
list = [1,2,3,4,5,6,7,8,9]
pool = Pool(processes=2)
pool.map(test, list)
pool.close()
pool.join()

apply

apply(func[, args[, kwds]])

  创建的进程会去执行func函数,并且传递参数args和关键字参数kwds,阻塞型,其实可以看成是单进程,一个执行完毕之后才会执行下一个。

Sample:

#!/usr/bin/env python
# -*- coding:utf-8 -*- from multiprocessing import Pool
import time def test(i):
print i
time.sleep(1) if __name__ == '__main__':
pool = Pool(processes=10)
for i in range(1, 100, 1):
# print i
pool.apply(test, args=(i,)) print 'test' pool.close()
pool.join()

apply_async

apply_async(func[, args[, kwds[, callback[, error_callback]]]])

  是上面介绍apply的非阻塞版/异步版。

Sample:

#!/usr/bin/env python
# -*- coding:utf-8 -*- from multiprocessing import Pool
import time def test(i):
print i
time.sleep(1) if __name__ == '__main__':
pool = Pool(processes=10)
for i in range(1, 100, 1):
# print i
pool.apply_async(test, args=(i,)) print 'test' pool.close()
pool.join()

  apply_async可能也是我们倾向于使用的,大家可以分别运行一下示例,对比看看它们之间的不同。

References:

  【Multiprocessing系列】Pool

  Python官方文档:Process Pools

Python Pool的更多相关文章

  1. python Pool并行执行

    # -*- coding: utf-8 -*- import time from multiprocessing import Pool def run(fn): #fn: 函数参数是数据列表的一个元 ...

  2. python中multiprocessing.pool函数介绍_正在拉磨_新浪博客

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     python中multiprocessing.pool函数介绍    (2010-06-10 03:46:5 ...

  3. python(进程池/线程池)

    进程池 import multiprocessing import time def do_calculation(data): print(multiprocessing.current_proce ...

  4. Linux进程启动/指令执行方式研究

    1. 通过glibc api执行系统指令 0x1:system() glibc api system是linux系统提供的函数调用之一,glibc也提供了对应的封装api. system函数的原型为: ...

  5. python进程池:multiprocessing.pool

    本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...

  6. [转载]python中multiprocessing.pool函数介绍

    原文地址:http://blog.sina.com.cn/s/blog_5fa432b40101kwpi.html 作者:龙峰 摘自:http://hi.baidu.com/xjtukanif/blo ...

  7. python的multiprocessing模块进程创建、资源回收-Process,Pool

    python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork( ...

  8. python中的进程池:multiprocessing.Pool()

    python中的进程池: 我们可以写出自己希望进程帮助我们完成的任务,然后把任务批量交给进程池 进程池帮助我们创建进程完成任务,不需要我们管理.进程池:利用multiprocessing 下的Pool ...

  9. [转]Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

随机推荐

  1. 使用docker-compose编排django、mysql实战

    背景: 本萌最近在部署自己开发的项目的时候发现同一套代码上传到服务器上后,部分功能莫名其妙的有点问题,服务器的各项配置都没有做过变动,所以想把项目转战到docker. 奈何刚接触docker,很多地方 ...

  2. [转帖]Nginx 的配置文件详解.

    nginx配置文件nginx.conf超详细讲解  https://www.cnblogs.com/liang-wei/p/5849771.html   #nginx进程,一般设置为和cpu核数一样w ...

  3. 微信公众平台实现获取用户OpenID的方法

    这篇文章主要介绍了微信公众平台实现获取用户OpenID的方法,需要开发人员经过微信授权后获取高级接口才能使用此功能,用户OpenID对于微信公众平台建设有着非常广泛的用途,需要的朋友可以参考下 本文实 ...

  4. 微信小程序组件 下拉刷新

    <!-- &&底部加载 --> <view class='page-add-data flexca'> <text>{{pageTottomText ...

  5. java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

    微信小程序前后台使用get方式传参时报错如图.但在微信开发平台和苹果测试都没事,在安卓手机上就报这个错,猜想原因是get传递了汉字的原因. 尝试了下在后台输出从前台获取的参数,但是后台什么也没有获取到 ...

  6. 适用于Rick的奖惩体系

    适用于Rick的奖惩体系 虽然对于时间有了更加清晰的认知,但是在时间管理方面还是不够严格,源于对自身的放松要求以及不够自律.第二个是周期性的思想松懈,比如周五了,想着马上周末了. 今天中午洗碗的时候, ...

  7. selenium基础-打开百度进行搜索

    1. 安装Python 2. 安装selenium 3. 下载谷歌驱动ChromeDriver,放到Python的Scripts目录下 4. 编写代码,如下 # coding: utf-8 from ...

  8. selenium实战之斗鱼弹幕

    python3.6.selenium.chromedriver 先上代码 from selenium import webdriver from time import sleep driver=we ...

  9. SpringBoot项目部署进阶

    一.war包部署 通过“云开发”平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的方式.但是,因为某些原因,软件需求方特别要求用war形式打包,我们该怎么做? 1.项目尚未开 ...

  10. BZOJ 4421: [Cerc2015] Digit Division

    4421: [Cerc2015] Digit Division Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 348  Solved: 202[Subm ...