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

    一、前言

      进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用进程为止。进程池的作用可以在多进程程序中有效的控制进程运行的个数,维护系统的稳定。

    二、multiprocessing.pool

      2.1 apply(func, args=(), kwds={})

      默认阻塞,所有进程是串行的,不建议使用

    from multiprocessing import Pool
    import time
    import os
    
    
    def foo(i):
        time.sleep(2)
        print('in process', os.getpid())
        return i + 100
    
    
    if __name__ == '__main__':   # windows 运行进程池一定要加这
    
        pool = Pool(5)   # 进程池中进程个数为5,多余的进程先挂起
    
        for i in range(10):
            pool.apply(func=foo, args=(i,))
    
        print('end')
        pool.close()
        pool.join()  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    

      注:所有进程会依次运行,主进程等待所有进程结束

      2.2 apply_async(func, args=(), kwds={}, callback=None, error_callback=None)

      非阻塞,进程池中的进程并行,支持回调 

    from multiprocessing import Pool
    import time
    import os
    
    
    def foo(i):
        time.sleep(1)
        print('in process', os.getpid())
        return i + 100
    
    
    if __name__ == '__main__':   # windows 运行进程池一定要加这
    
        pool = Pool(5)   # 进程池中进程个数为5,多余的进程先挂起
    
        for i in range(10):
            pool.apply_async(func=foo, args=(i,))
    
    
        print('end')
        pool.close()
        pool.join()  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    

    三、回调函数

       在apply_async中执行回调函数,每执行完一个子进程,主进程就调用一下回调函数,回调函数执行完后再执行下一个子进程 

    # -*- coding: UTF-8 -*-
    
    from multiprocessing import Pool
    import time
    import os
    
    
    def foo(i):
        time.sleep(1)
        print('in process', os.getpid())
        return i + 100
    
    
    def bar(arg):   # 增加的回到函数, 其实回调函数是主进程执行的
        print('-->exec done:', arg, os.getpid())
    
    
    if __name__ == '__main__':   # windows 运行进程池一定要加这
    
        pool = Pool(5)   # 进程池中进程个数为5,多余的进程先挂起
        print('main process pid,', os.getpid())
        for i in range(10):
            pool.apply_async(func=foo, args=(i,), callback=bar)
            # pool.apply(func=foo, args=(i,))
    
        print('end')
        pool.close()
        pool.join()  # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
    

      注:通过进程pid可以看出,回调函数其实是由主进程执行的 

  • 相关阅读:
    Netty指定分隔的字符
    Netty解决TCP粘包/拆包问题
    TCP粘包/拆包问题
    Netty5-应答服务器
    线程池中的线程的排序问题
    Java NIO 概述
    在windows中,如何使用cmd命令行窗口正确显示编码为utf-8格式的文字
    OXM
    Mysql event时间触发器,实现定时修改某些符合某一条件的某一字段
    linux 环境 tomcat 莫名奇妙挂掉
  • 原文地址:https://www.cnblogs.com/bigberg/p/8000227.html
Copyright © 2011-2022 走看看