python网络编程--进程池

一:进程池

  进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,

  如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

 

  进程池中有两个方法:

  • apply
  • apply_async
  进程池 apply是串行;apply_async是并行
  pool必须先要close在join,进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭

 

二:代码示例

  有join代码和结果

# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
from multiprocessing import Process,Pool
import time
def Foo(i):
    time.sleep(2)
    return i+100

def Bar(arg):
    print("-->exec done",arg)

if __name__=="__main__":#main如果有main表示手动运行,执行main下面代码,如果是导入模块就不执行
    pool=Pool(5)

    for i in range(10):
        pool.apply_async(func=Foo,args=(i,),callback=Bar)
        #Foo执行完的结果会当作参数给Bar
        #callback是主进程调用,比如数据库连接,如果在子进程每次都生成连接就会占用资源,在主进程只要生成一次
    print("end")
    pool.close()
    pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭

"""
end
-->exec done 100
-->exec done 101
-->exec done 102
-->exec done 103
-->exec done 104
-->exec done 105
-->exec done 106
-->exec done 107
-->exec done 108
-->exec done 109
"""

 

没有join代码,主进程执行完直接退出了,所以子进行没有结果输出

  

# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
from multiprocessing import Process,Pool
import time
def Foo(i):
    time.sleep(2)
    return i+100

def Bar(arg):
    print("-->exec done",arg)

if __name__=="__main__":#main如果有main表示手动运行,执行main下面代码,如果是导入模块就不执行
    pool=Pool(5)

    for i in range(10):
        pool.apply_async(func=Foo,args=(i,),callback=Bar)
        #Foo执行完的结果会当作参数给Bar
        #callback是主进程调用,比如数据库连接,如果在子进程每次都生成连接就会占用资源,在主进程只要生成一次
    print("end")
    pool.close()
    #pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭

 

posted on 2017-06-25 20:26  shisanjun  阅读(179)  评论(0编辑  收藏  举报

导航