Python 多进程编程之multiprocessing--Pool

Python 多进程编程之multiprocessing--Pool

----当需要创建的子进程数量不多的时候,可以直接利用multiprocessing 中的Process 动态生成多个进程,

----但是,如果是成百上千个任务,手动创建的话,工作量会很大,此时就会用到multiprocessing 下的Pool

----初始化Pool 时,可以指定一个最大的进程数,当背后的请求提交到Pool 中时,如果池子没有满,那么就会创建一个新的进程来执行该请求. 如果满了(池子中的进程以及达到最大进程数)那么该请求就会等待,直到池子中有进程结束,才会创建新的进程来执行.

from multiprocessing import Pool
import os,time,random

#定义一个函数
def download(i):
    print("(%d)--ID号为:%d的进程开始执行"%(i,os.getpid()))
    t_start = time.time()

    time.sleep(random.random()*10)

    t_stop = time.time()
    print("(%d)---ID:%d执行完毕,耗时%f秒!"%(i,os.getpid(),t_stop-t_start))

if __name__ == "__main__":
    po = Pool(3)#定义一个进程池,最大进程的数量
    for i in range(10):

        #每次循环将会用空闲出来的子进程去调用目录--同步(自加阻塞)
        #po.apply(func=download,args=(i,))

        #每次循环将会用空闲出来的子进程去调用目录--异步
        po.apply_async(func=download,args=(i,))

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

    print("----end------")
  • 添加join()的原因是,
    ----此方法可能不会在页面打印除任何内容,因为一次执行3个进程
    ----3个进程执行的时间相差极为短暂,会在打印页面引起冲突,所以不会有任何内容输出
  • po.apply(func=download,args=(i,)) 执行的结果如下:你会发现是每次执行一个进程.
  • (0)id号为:25334的进程开始执行
    (0)id号25334执行完毕,耗时3.866196秒
    (1)id号为:25335的进程开始执行
    (1)id号25335执行完毕,耗时3.393492秒
    (2)id号为:25333的进程开始执行
    (2)id号25333执行完毕,耗时9.758717秒
    (3)id号为:25334的进程开始执行
    (3)id号25334执行完毕,耗时0.150672秒
    (4)id号为:25335的进程开始执行
    (4)id号25335执行完毕,耗时8.498094秒
    (5)id号为:25333的进程开始执行
    (5)id号25333执行完毕,耗时9.061761秒
    (6)id号为:25334的进程开始执行
    (6)id号25334执行完毕,耗时8.845187秒
    (7)id号为:25335的进程开始执行
    (7)id号25335执行完毕,耗时6.623793秒
    (8)id号为:25333的进程开始执行
    (8)id号25333执行完毕,耗时2.530908秒
    (9)id号为:25334的进程开始执行
    (9)id号25334执行完毕,耗时9.739911秒
    ------start-------
    ------end----------
    
  • po.apply_async(func=download,args=(i,))   执行的结果如下:你会发现开始是执行3个进程,之后只要有进程结束,等待的进程就会执行
  • ------start-------
    (1)id号为:25313的进程开始执行
    (2)id号为:25314的进程开始执行
    (0)id号为:25315的进程开始执行
    (0)id号25315执行完毕,耗时0.853286秒
    (3)id号为:25315的进程开始执行
    (3)id号25315执行完毕,耗时5.674426秒
    (4)id号为:25315的进程开始执行
    (4)id号25315执行完毕,耗时1.449967秒
    (5)id号为:25315的进程开始执行
    (1)id号25313执行完毕,耗时9.333982秒
    (6)id号为:25313的进程开始执行
    (2)id号25314执行完毕,耗时9.982127秒
    (7)id号为:25314的进程开始执行
    (5)id号25315执行完毕,耗时2.919765秒
    (8)id号为:25315的进程开始执行
    (7)id号25314执行完毕,耗时2.520782秒
    (9)id号为:25314的进程开始执行
    (6)id号25313执行完毕,耗时6.414589秒
    (9)id号25314执行完毕,耗时7.013178秒
    (8)id号25315执行完毕,耗时9.927967秒
    ------end----------
    

原文地址:https://www.cnblogs.com/Fantinai/p/8428579.html

时间: 2024-10-09 11:12:31

Python 多进程编程之multiprocessing--Pool的相关文章

Python 多进程编程之multiprocessing--Process

Python 多进程编程之multiprocessing 1,Process 跨平台的进程创建模块(multiprocessing), 支持跨平台:windowx/linux 创建和启动      创建格式:p=Process(target=函数名)----def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):group:分组(基本不用)target:表示这个进程实例所调用的对象.name:给进程起一

Python 多进程编程之fork()

Python实现多进程可以用系统fork()方法和python的multiprocessing类 1,fork()方法是Unix/Linux操作系统提供的,在python的os模块中自带fork(). 在windows中不能使用,这是它的特殊之处 在使用fork()方法之前,我们先来了解一下fork的英文解释:基本都是分叉,叉开,分支的意思, 所以,fork()方法在创建子进程时,会将主进程中的所有代码复制一份到子进程 虽然是复制了父进程的所有代码,但是,子进程不会执行所有的代码,它在父进程中在

python多进程的理解 multiprocessing Process join run

最近看了下多进程. 一种接近底层的实现方法是使用 os.fork()方法,fork出子进程.但是这样做事有局限性的.比如windows的os模块里面没有 fork() 方法. windows:.linux: 另外还有一个模块:subprocess.这个没整过,但从vamei的博客里看到说也同样有局限性. 所以直接说主角吧 --- multiprocessing模块. multiprocessing模块会在windows上时模拟出fork的效果,可以实现跨平台,所以大多数都使用multiproce

深入浅出--UNIX多进程编程之fork()函数

0前言 上周都在看都在学习unix环境高级编程的第八章--进程控制.也就是这一章中,让我理解了unix中一些进程的原理.下面我就主要按照进程中最重要的三个函数来进行讲解.让大家通过阅读这一篇文章彻底明白进程这点事.希望对大家有所帮助. 1进程环境 在学习进程之前,一定要了解一下unix的进程环境.系统如何对进程终止,和一个程序启动终止,程序运行的原理等,这些都有助于你理解进程的运行原理.这些内容都在我的上一篇文章中,请关注:http://blog.csdn.net/wallwind/articl

python多线程编程之Queue---put/get 方法的阻塞

python 中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 1. 阻塞模式导致数据污染 import Queue       q = Queue.Queue(10)       for i in range(10):               myData = 'A'               q.put(myData)               myData = 'B' 这是一段极其简单的代码,但我总是不能

python并发编程之IO模型,

了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义,其实绝大多数函数都是同步调用.但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务. #举例: #1. multiprocessing.Pool下的apply #发起同步调用后,就在原地等着任务结束,根本不考虑任务是在计算还是在io阻

python进程池:multiprocessing.pool

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

python并发编程之IO模型

了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义,其实绝大多数函数都是同步调用.但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务. #举例: #1. multiprocessing.Pool下的apply #发起同步调用后,就在原地等着任务结束,根本不考虑任务是在计算还是在io阻

Python并发编程之:多进程

一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.Python提供了multiprocessing.    multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似.  multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,