python基础学习日志day10-进程池

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础学习日志day10-进程池相关的知识,希望对你有一定的参考价值。

一:进程池

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

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

 

  进程池中有两个方法:

  • 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()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭

技术分享

 


以上是关于python基础学习日志day10-进程池的主要内容,如果未能解决你的问题,请参考以下文章

python基础学习日志day10-

python基础学习日志day10-事件驱动模型

python基础学习日志day10-SelectPollEpoll异步IO

Python入门学习-DAY37-进程池与线程池协程gevent模块

python基础学习日志day10-协程

python基础学习日志day8-异常处理