Python多进程并发操作中进程池Pool的应用
2013-07-26 10:16
639 查看
在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,10几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,这时候进程池Pool发挥作用的时候就到了。
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。这里有一个简单的例子:
先创建容量为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可以很方便的同时自动处理几百或者上千个并行操作,脚本的复杂性也大大降低。
multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
processes表示pool中进程的数目,默认地为当前CPU的核数。
initializer表示新进程的初始化函数。
initargs表示新进程的初始化函数的参数。
maxtasksperchild表示每个进程执行task的最大数目(该参数解释见python 进程池1 - Pool使用简介)。
apply用于传递不定参数,同python中的apply函数一致(不过内置的apply函数从2.3以后就不建议使用了),主进程会阻塞于函数。
主进程的执行流程同单进程一致。
2、apply_async(func[, args[, kwds[, callback]]])
与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。
主进程循环运行过程中不等待apply_async的返回结果,在主进程结束后,即使子进程还未返回整个程序也会退出。虽然 apply_async是非阻塞的,但其返回结果的get方法却是阻塞的,如使用result.get()会阻塞主进程。
如果我们对返回结果不感兴趣, 那么可以在主进程中使用pool.close与pool.join来防止主进程退出。注意join方法一定要在close或terminate之后调用。
3、map(func, iterable[, chunksize])
map方法与在功能上等价与内置的map(),只不过单个任务会并行运行。它会使进程阻塞直到结果返回。
但需注意的是其第二个参数虽然描述的为iterable, 但在实际使用中发现只有在整个队列全部就绪后,程序才会运行子进程。
4、map_async(func, iterable[, chunksize[, callback]])
与map用法一致,但是它是非阻塞的。其有关事项见apply_async。
5、imap(func, iterable[, chunksize])
与map不同的是, imap的返回结果为iter,需要在主进程中主动使用next来驱动子进程的调用。即使子进程没有返回结果,主进程对于gen_list(l)的 iter还是会继续进行, 另外根据python2.6文档的描述,对于大数据量的iterable而言,将chunksize设置大一些比默认的1要好。
for x in pool.imap(pool_test, gen_list(l)):
pass
6、imap_unordered(func, iterable[, chunksize])
同imap一致,只不过其并不保证返回结果与迭代传入的顺序一致。
7、close()
关闭pool,使其不再接受新的任务。
8、terminate()
结束工作进程,不再处理未处理的任务。
9、join()
主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。
引用:懒人的世界(http://sysadm.blog.chinaunix.net),版权所有,如需转载,请注明出处
和http://www.cnblogs.com/congbo/archive/2012/08/23/2652490.html
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可以很方便的同时自动处理几百或者上千个并行操作,脚本的复杂性也大大降低。
multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
processes表示pool中进程的数目,默认地为当前CPU的核数。
initializer表示新进程的初始化函数。
initargs表示新进程的初始化函数的参数。
maxtasksperchild表示每个进程执行task的最大数目(该参数解释见python 进程池1 - Pool使用简介)。
Pool相关函数
1、apply(func[, args[, kwds]])apply用于传递不定参数,同python中的apply函数一致(不过内置的apply函数从2.3以后就不建议使用了),主进程会阻塞于函数。
主进程的执行流程同单进程一致。
2、apply_async(func[, args[, kwds[, callback]]])
与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。
主进程循环运行过程中不等待apply_async的返回结果,在主进程结束后,即使子进程还未返回整个程序也会退出。虽然 apply_async是非阻塞的,但其返回结果的get方法却是阻塞的,如使用result.get()会阻塞主进程。
如果我们对返回结果不感兴趣, 那么可以在主进程中使用pool.close与pool.join来防止主进程退出。注意join方法一定要在close或terminate之后调用。
3、map(func, iterable[, chunksize])
map方法与在功能上等价与内置的map(),只不过单个任务会并行运行。它会使进程阻塞直到结果返回。
但需注意的是其第二个参数虽然描述的为iterable, 但在实际使用中发现只有在整个队列全部就绪后,程序才会运行子进程。
4、map_async(func, iterable[, chunksize[, callback]])
与map用法一致,但是它是非阻塞的。其有关事项见apply_async。
5、imap(func, iterable[, chunksize])
与map不同的是, imap的返回结果为iter,需要在主进程中主动使用next来驱动子进程的调用。即使子进程没有返回结果,主进程对于gen_list(l)的 iter还是会继续进行, 另外根据python2.6文档的描述,对于大数据量的iterable而言,将chunksize设置大一些比默认的1要好。
for x in pool.imap(pool_test, gen_list(l)):
pass
6、imap_unordered(func, iterable[, chunksize])
同imap一致,只不过其并不保证返回结果与迭代传入的顺序一致。
7、close()
关闭pool,使其不再接受新的任务。
8、terminate()
结束工作进程,不再处理未处理的任务。
9、join()
主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。
引用:懒人的世界(http://sysadm.blog.chinaunix.net),版权所有,如需转载,请注明出处
和http://www.cnblogs.com/congbo/archive/2012/08/23/2652490.html
相关文章推荐
- Python多进程并发操作中进程池Pool的应用
- Python多进程并发操作中进程池Pool的应用
- Python多进程并发操作中进程池Pool的应用<转>
- Python多进程并发操作中进程池Pool的应用
- Python多进程并发操作中进程池Pool的应用
- Python 多进程并发操作中进程池Pool
- Python 多进程并发操作中进程池Pool的实例
- Python多进程并发操作进程池Pool
- python学习笔记——multiprocessing 多进程组件 进程池Pool
- python:Process、join()、进程的创建Process子类、进程池Pool、将一个文件夹的内容copy到另一个文件夹
- python:Process、join()、进程的创建Process子类、进程池Pool、将一个文件夹的内容copy到另一个文件夹
- Python多进程操作-进程池(Pool)
- python3全栈开发-并发编程,多进程的基本操作
- 11.python并发入门(part11 进程同步锁,以及进程池,以及callback的概念)
- python进程之间修改数据[Manager]与进程池[Pool]
- 【Python】多进程的进程池pool运行时报错:ValueError: Pool not running
- Python 之小白的系统进程的理解之进程池Pool
- python中的进程池创建进程
- Python进程池Pool中的Queue
- python进程池:multiprocessing.pool