您的位置:首页 > 编程语言 > Python开发

Python多任务(四)-----进程池Pool

2019-02-15 11:33 120 查看

Python中的进程池

进程池Pool

  • 当需要创建的子进程数量不多,可以直接利用multiprocessing中的Process动态的生成多个进程。
  • 但如果是上百个甚至上千个目标,手动的去创建线程工作量很大,此时就可以用到multiprocessing模块提供的Pool方法
  • 我们应该对实际的应用场景来判断是否使用进程池。
  • 初始化 Pool 时,可以指定一个最大的进程数,当有新的请求提交到Pool中时: 如果池还没满,那么就会创建一个新的进程来执行该请求。
  • 如果池中的进程数已经达到指定的最大值,那么该请求就会等待直到池中有进程结束,才会用之前的进程来执行该请求
  • 主进程和子进程:
      一般情况,主进程会等待子进程结束后才会结束。
    • 但是,在进程池中,主线程不会等待子进程,即主进程的结束与子进程再无关联。 当主进程结束时,无论子进程是否结束,子进程会立刻死亡。
    • 所以,在使用进程池的过程中注意适当的堵塞主进程。
  • 切记:进程池中产生异常的话,不会显示异常!
  • 进程池的内置方法:
      apply(func[, args[, kwds]])方法: 不建议使用
    • 向进程池中添加任务(进程)
    • 默认阻塞,所有进程时串行。意思就是等待当前子进程执行完毕后,在执行下一个进程。
    • 说明 :首先主进程开始运行,碰到子进程,操作系统切换到子进程,等待子进程运行结束后,在切换到另外一个子进程,直到所有子进程运行完毕。然后在切换到主进程,运行剩余的部分。
  • apply_async(func, (msg, ))方法:
      异步非阻塞式
    • 向进程池中添加任务(进程)
    • 参数func是函数名称
    • 参数(msg, )作用是为创建的子进程传参
    • 说明 :首先主进程开始运行,碰到子进程后,主进程说:让我先运行个够,等到操作系统进行进程切换的时候,在交给子进程运行。 如果不加join()可能会出现以下状况:由于我们的程序太短,然而还没等到操作系统进行进程切换,主进程就运行完毕了。
  • close()方法:
      关闭进程池,表示不能在向进程池中添加新的请求(进程)
  • join()方法:
      等待进程池中的所有进程执行结束,必须放在close()之后
  • 使用如下:
      导入multiprocessing模块中的Pool方法
    1. 调用Pool()方法(其中参数代表该进程池开启的最大进程量)
    2. 向进程池中添加任务
    3. 关闭进程池(不再接受任务)
    4. 调用join()方法,等待进程池中的所有进程执行结束
        防止在子进程没结束时,主进程的结束导致所有子进程立刻结束。
    from multiprocessing import Pool
    
    def text(msg):
    for i in range(3):
    print("(" + str(msg) + "):" + str(i))
    
    if __name__ == "__main__":
    # 创建一个线程池,最大进程数为3
    pool = Pool(3)
    for i in range(10):
    # 向进程池中添加任务
    pool.apply_async(text, (i, ))
    
    print("---start---")
    # 关闭进程池,表示不能在往进程池中添加进程
    pool.close()
    # 等待进程池中的所有进程执行结束
    pool.join()
    print("--- end ---")
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: