3.3.2 进程池

Posted infinitecodes

tags:

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

进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

  • apply
  • apply_async

串行示例

from multiprocessing import Process, Pool
import time, os

def f(i):
    time.sleep(1)
    print(‘Process: ‘, os.getpid())    #2每个进程输出当前进程ID
    return i + 100

def bar(arg):
    print(‘Process %s execution is done!‘, arg % os.getpid())

if __name__ == ‘__main__‘:
    p = Pool(5)    #1启动一个池子,池子最多同时允许5个进程工作
    for i in range(10):
        p.apply(func=f, args=(i, ))    #使用apply()方法,池子中的进程按串行执行
    print(‘End‘)    #3
    p.close()

结果

Process:  3804
Process:  11880
Process:  3740
Process:  128
Process:  644
Process:  3804
Process:  11880
Process:  3740
Process:  128
Process:  644
End

并行示例

from multiprocessing import Process, Pool
import time, os

def f(i):
    time.sleep(1)
    print(‘Process: ‘, os.getpid())    #2.1每个进程输出当前进程ID
    return i + 100

def bar(arg):
    print(‘Process %s execution is done!‘, arg % os.getpid())    #2.2执行callback

if __name__ == ‘__main__‘:
    p = Pool(5)    #1启动一个池子,池子最多同时允许5个进程工作
    for i in range(10):
        p.apply_async(func=f, args=(i, ), callback=bar)
        #使用apply_async()方法,池子中的进程按并行执行
    print(‘End‘)    #3
    p.close()
    p.join()

结果

End
Process: Process:  14420 
7708
Process %s execution is done! 101
Process %s execution is done! 100
Process:  14936
Process %s execution is done! 102
Process:  9632Process: 
 14096
Process %s execution is done! 103
Process %s execution is done! 104
Process:  Process: 14420
 7708
Process %s execution is done! 105
Process %s execution is done! 106
Process:  14936
Process %s execution is done! 107
Process: Process:   9632
14096
Process %s execution is done! 108
Process %s execution is done! 109

每次蹦出5条结果

以上是关于3.3.2 进程池的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

多线程编程

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

python进程进程池代码部分

线程池

IIS6 程序池错误< 'DefaultAppPool' 提供服务的进程意外终止>