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----------

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

  1. Python 多进程编程之multiprocessing--Process

    Python 多进程编程之multiprocessing 1,Process 跨平台的进程创建模块(multiprocessing), 支持跨平台:windowx/linux 创建和启动      创 ...

  2. python并发编程之multiprocessing进程(二)

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...

  3. Python 多进程编程之fork()

    Python实现多进程可以用系统fork()方法和python的multiprocessing类 1,fork()方法是Unix/Linux操作系统提供的,在python的os模块中自带fork(). ...

  4. python并发编程之Queue线程、进程、协程通信(五)

    单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ...

  5. python并发编程之gevent协程(四)

    协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ...

  6. python并发编程之asyncio协程(三)

    协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...

  7. python并发编程之threading线程(一)

    进程是系统进行资源分配最小单元,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.进程在执行过程中拥有独立的内存单元,而多个线程共享内存等资源. 系列文章 py ...

  8. Python函数式编程之map()

    Python函数式编程之map() Python中map().filter().reduce()这三个都是应用于序列的内置函数. 格式: map(func, seq1[, seq2,…]) 第一个参数 ...

  9. Python在云端编程之IPython notebook

    Python在云端编程之IPython notebook 如果本地编程考虑到Python版本,机器位数,编译环境,科学栈安装等等繁琐的事,弄得你焦头烂额,不如移步云端,省去这些繁琐过程,在云端编程是很 ...

随机推荐

  1. IIS7.5 PHP环境HTTP经常500错误处理方法

    IIS使用FastCGI方式配置PHP以后,在编写PHP程序时,经常会出现HTTP 500错误 HTTP 500(Internal Server Error):服务器尝试执行请求时遇到了意外情况.研究 ...

  2. python 前后端分离 简单的数据库返回接口

    1.使用node http-server 起本地服务器  或者打开nginx 直接用nginx的默认页面也可以 (用下面的html文件替换nginx下html文件夹下的index.html) http ...

  3. oracle数据库报错ora-01653表空间扩展失败解决方案

    1)ora-01653错误截图: 可以看到有两张表的insert受到了影响,都是在USERS表空间里.用以下SQL查看表空间使用情况: "表空间大小(M)",(a.bytes &q ...

  4. SQL查数据库有哪些触发器,存储过程...

    select name from sysobjects where xtype='TR' --所有触发器select name from sysobjects where xtype='P' --所有 ...

  5. Shiro+CAS

    参考链接: CAS实现单点登录SSO执行原理探究:http://blog.csdn.net/javaloveiphone/article/details/52439613 单点登录CAS技术概述:ht ...

  6. 关于连接oracle工具plsql的一些使用

    上面图片是打开客户端PL\SQL devepoper的连接内容 进入页面后就可以进行相关的sql语句编写了 将几个结果放入一个表中 select 30+30 as 结果 from dual union ...

  7. JAVA性能优化:35个小细节让你提升java代码的运行效率

    代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...

  8. swift kvc赋值

    1定义模型属性的时候,如果是对象,通常都是可选的(在需要的时候创建,避免写构造函数,简化代码) 2如果是基本数据类型,不能设置成可选的(运行时获取不到属性),而且要设置初始值,否则KVC会崩溃 3使用 ...

  9. C# Excel添加超链接

    操作当前单元格(关键代码就两行) Range range = (Range)ExSheet.Cells[i + 2, j + 1];                                   ...

  10. <记录> Razor引擎&视图布局

    标识符 @ Razor支持HTML和C#代码混编,意味着可以在HTML中随意输出变量 基本使用方法 直接@后面跟变量(当遇到 HTML标签 .空格.换行符等特殊符号时 便认为@之后到特殊符号前为变量名 ...