python 进程池pool使用详解

和选用线程池来关系多线程类似,当程序中设置到多进程编程时,Python 提供了更好的管理多个进程的方式,就是使用进程池。

在利用 Python 进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。

当被操作对象数目不大时,可以直接利用 multiprocessing 中的 Process 动态生成多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

Pool可以提供指定数量的进程供用户调用,当有新的请求提交到 pool 中时,如果进程池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

Python multiprocessing 模块提供了 Pool() 函数,专门用来创建一个进程池,该函数的语法格式如下:

multiprocessing.Pool( processes )

其中,processes 参数用于指定该进程池中包含的进程数。

如果进程是 None,则默认使用 os.cpu_count() 返回的数字(根据本地的 cpu 个数决定,processes 小于等于本地的 cpu 个数)。

请看下面的实例:

from multiprocessing import Pool
import os
import time
import random

def worker(msg):
  t_start = time.time()
  print("%s开始执行,进程号为%d" % (msg, os.getpid()))
  # random.random()随机生成0~1之间的浮点数
  time.sleep(random.random()*2)
  t_stop = time.time()
  print(msg, "执行完毕,耗时%0.2f" % (t_stop-t_start))

if __name__ == "__main__":
  po = Pool(3) # 定义一个进程池,最大进程数3
  for i in range(0, 8):
    # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker, (i,))

  print("----start----")
  # 关闭进程池,关闭后po不再接收新的请求
  po.close()
  # 等待po中所有子进程执行完成,必须放在close语句之后
  po.join()
  print("-----end-----")

运行结果:

multiprocessing.Pool 常用方法说明

apply_async(func[, args[, kwds]]) :使用非阻塞方式调用 func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args 为传递给 func 的参数列表,kwds 为传递给 func 的关键字参数列表。

close():关闭 Pool,使其不再接受新的任务。

terminate():不管任务是否完成,立即终止。

join():主进程阻塞,等待子进程的退出, 必须在 close 或 terminate 之后使用。

进程池中的 Queue

如果要使用 Pool 创建进程,就需要使用 multiprocessing.Manager() 中的 Queue(),而不是 multiprocessing.Queue(),否则会得到一条如下的错误信息:

RuntimeError: Queue objects should only be shared between processes through inheritance.

下面的实例演示了进程池中的进程如何通信:

from multiprocessing import Manager, Pool
import os
import time
import random

def writer(q):
  print("writer启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
  for i in "xiaoming":
    q.put(i)

def reader(q):
  print("reader启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
  for i in range(q.qsize()):
    print("reader从Queue获取到消息:%s" % q.get(True))

if __name__ == "__main__":
  print("(%s) start" % os.getpid())
  # 使用Manager中的Queue
  q = Manager().Queue()
  po = Pool()
  po.apply_async(writer, (q,))
  # 先让上面的任务向Queue存入数据,然后再让下面的任务开始从中取数据
  time.sleep(1)
  po.apply_async(reader, (q,))
  po.close()
  po.join()
  print("(%s) End" % os.getpid())

运行结果:

(17528) start
writer启动(2216),父进程为(17528)
reader启动(2216),父进程为(17528)
reader从Queue获取到消息:x
reader从Queue获取到消息:i
reader从Queue获取到消息:a
reader从Queue获取到消息:o
reader从Queue获取到消息:m
reader从Queue获取到消息:i
reader从Queue获取到消息:n
reader从Queue获取到消息:g
(17528) End

以上就是python 进程池pool使用详解的详细内容,更多关于python 进程池pool的资料请关注我们其它相关文章!

时间: 2020-10-14

Python进程池Pool应用实例分析

本文实例讲述了Python进程池Pool应用.分享给大家供大家参考,具体如下: 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法. 初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求:但如果池中的进程数已经达到指定的最大值,那么该请求就会

Python基于进程池实现多进程过程解析

1.注意:pool必须在 if __name__ == '__main__' 下面运行,不然会报错 2.多进程内出现错误会直接跳过该进程,并且默认不会打印错误信息 3.if__name__下面的数据需要通过参数传入主函数里面,不然主函数获取不到该数据值而报错. 4.若不通过传参形式传入数据,可以定义全局变量.但是全局变量的值不能在多进程里面进行修改. 代码如下 from multiprocessing import Pool # 进程池,用于多进程 import os # 用于获取当前执行的文件

Python多进程multiprocessing、进程池用法实例分析

本文实例讲述了Python多进程multiprocessing.进程池用法.分享给大家供大家参考,具体如下: 内容相关: multiprocessing: 进程的创建与运行 进程常用相关函数 进程池: 为什么要有进程池 进程池的创建与运行:串行.并行 回调函数 多进程multiprocessing: python中的多进程需要使用multiprocessing模块 多进程的创建与运行: 1.进程的创建:进程对象=multiprocessing.Process(target=函数名,args=(参

Python多进程池 multiprocessing Pool用法示例

本文实例讲述了Python多进程池 multiprocessing Pool用法.分享给大家供大家参考,具体如下: 1. 背景 由于需要写python程序, 定时.大量发送htttp请求,并对结果进行处理. 参考其他代码有进程池,记录一下. 2. 多进程 vs 多线程 c++程序中,单个模块通常是单进程,会启动几十.上百个线程,充分发挥机器性能.(目前c++11有了std::thread编程多线程很方便,可以参考我之前的博客) shell脚本中,都是多进程后台执行.({ ...} &, 可以参考

Python 多进程并发操作中进程池Pool的实例

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,10几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,这时候进程池Pool发挥作用的时候就到了. Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求:但如果池中的进程数已经达到规定

Python高级编程之消息队列(Queue)与进程池(Pool)实例详解

本文实例讲述了Python高级编程之消息队列(Queue)与进程池(Pool).分享给大家供大家参考,具体如下: Queue消息队列 1.创建 import multiprocessing queue = multiprocessing.Queue(队列长度) 2.方法 方法 描述 put 变量名.put(数据),放入数据(如队列已满,则程序进入阻塞状态,等待队列取出后再放入) put_nowait 变量名.put_nowati(数据),放入数据(如队列已满,则不等待队列信息取出后再放入,直接报

Python多进程库multiprocessing中进程池Pool类的使用详解

问题起因 最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bagging ensemble!只是我没有抽样.文本不大,大概3000行,topic个数为8,于是我写了一个串行的程序,一个topic算完之后再算另一个topic.可是我在每个topic中用了GridSearchCV来调参,又要选特征又要调整regressor的参数,导致参数组合一共有1782种.我真

python进程池实现的多进程文件夹copy器完整示例

本文实例讲述了python进程池实现的多进程文件夹copy器.分享给大家供大家参考,具体如下: 应用:文件夹copy器(多进程版) import multiprocessing import os import time import random def copy_file(queue, file_name,source_folder_name, dest_folder_name): """copy文件到指定的路径""" f_read = op

Python实现删除时保留特定文件夹和文件的示例

实现功能:删除当前目录下,除保留目录和文件外的所有文件和目录 #!bin/env python import os import os.path import shutil def DeleteFiles(path, remainDirsList, filesList): dirsList = [] dirsList = os.listdir(path) for f in dirsList: if f not in remainDirsList: filePath = os.path.join(

python批量创建指定名称的文件夹

本文实例为大家分享了python批量创建指定名称的文件夹具体代码,供大家参考,具体内容如下 继删除多余文件之后,做了一些数据处理,需要重新保存数据,但文件夹的名称又不能改 所以只能创建新的文件夹,换个路径用之前的文件夹名 import os import glob #txt文件生成一次就好,或者用os.walk遍历需要的文件夹名称路径 def mk_text(txt_path): folders = glob.glob(txt_path + '/*_1') writeText = open('F

解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题

1. os.listdir()概述 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表. 例如: dir ='F:/Home_01/img'#当前目录 filenames=os.listdir(dir)#filenames存储dir下的所有文件名. 注意:os.listdir()返回的文件名不一定是顺序的,也就是说结果是不固定的,如下图,则filenames[0]有可能为'22.jpg',而不是我们所希望的'11.jpg'. 解决办法: filenames=os.l

Python批处理删除和重命名文件夹的实例

1. 删除当前目录下不含有指定文件类型的文件夹 #!/usr/bin/python # -*- coding: UTF-8 -*- import sys import os import shutil pwd = os.getcwd() L = os.listdir(".") f = open("out.txt", "w") for dirname in L: if os.path.isdir(dirname): print("dir

python读取目录下最新的文件夹方法

如下所示: def new_report(test_report): lists = os.listdir(test_report) # 列出目录的下所有文件和文件夹保存到lists lists.sort(key=lambda fn: os.path.getmtime(test_report + "/" + fn)) # 按时间排序 file_new = os.path.join(test_report, lists[-1]) # 获取最新的文件保存到file_new print(fi

python 移动图片到另外一个文件夹的实例

如下所示: # -*- coding:utf8 -*- import os import shutil import numpy as np import pandas as pd path_img='C:/Users/49691/Desktop/数据集/test' ls = os.listdir(path_img) lenl=len(ls) print(len(ls)) train_labels = pd.read_csv('C:/Users/49691/Desktop/数据集/b.csv')

python根据txt文本批量创建文件夹

前言 前言:想写这个代码的原因是因为实习的时候需要根据表格名创建对应的文件夹,如果只是很少个数文件夹的话,ctrl+shift+n还可以接受吧,可是一次就要创建几百个文件夹,这就有点方方了.所以我写了一些代码解决实际的问题吧. 正文 正文:其实这是一个简单的代码集合,然后就实现了 代码目录结构 │ 创建文件夹.py ├─docs │ try.txt └─folder 第一个文件自然就是代码的位置:try.txt是存的所有要生成的文件夹名称列表,是直接从excel表格获取复制粘贴的,编码格式utf