zoukankan      html  css  js  c++  java
  • python 进程池pool

    进程池:   

       在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。  
        Pool可以提供指定数量的进程供用户调用,当有新的请求提交到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之后使用。

    例:

    # -*- coding: UTF-8 -*-

    from gevent.pool import Pool
    from gevent import monkey
    monkey.patch_all()

     

    #要在调用进程池执行的函数

    def sayHi(num):

      print "def print result:",num

    #进程池最大运行数

    p = Pool(4)

    #模拟并发调用线程池

    for i in range(10):

      p.map(sayHi,[i])

     

    执行结果:

    def print result: 0

    def print result: 1

    def print result: 2

    def print result: 3

    def print result: 4

    def print result: 5

    def print result: 6

    def print result: 7

    def print result: 8

    def print result: 9

  • 相关阅读:
    使用cout进行格式化
    20175324 《Java程序设计》第3周学习总结
    20175324第二周学习总结
    第三周学习总结
    JAVA第二周学习总结
    20175330第一周学习总结。
    20175330第一周学习总结
    指针
    数组总结(一)
    数组练习题A财务管理
  • 原文地址:https://www.cnblogs.com/zhaobang/p/6937004.html
Copyright © 2011-2022 走看看