当需要创建子进程数量不多的时候,可以直接利用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(2* random.random())
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() #等待进程池中所有子进程执行完成,阻塞必须放在close之后
print('-------end---------')
-------start---------
(0)--进程ID为6476的进程开始执行
(1)--进程ID为6212的进程开始执行
(2)--进程ID为6284的进程开始执行
(0)--进程ID为6476的进程执行完毕,耗时0.975056秒
(3)--进程ID为6476的进程开始执行
(1)--进程ID为6212的进程执行完毕,耗时1.030059秒
(4)--进程ID为6212的进程开始执行
(2)--进程ID为6284的进程执行完毕,耗时1.735099秒
(5)--进程ID为6284的进程开始执行
(4)--进程ID为6212的进程执行完毕,耗时1.078062秒
(6)--进程ID为6212的进程开始执行
(6)--进程ID为6212的进程执行完毕,耗时0.373021秒
(7)--进程ID为6212的进程开始执行
(3)--进程ID为6476的进程执行完毕,耗时1.759101秒
(8)--进程ID为6476的进程开始执行
(5)--进程ID为6284的进程执行完毕,耗时1.608092秒
(9)--进程ID为6284的进程开始执行
(9)--进程ID为6284的进程执行完毕,耗时0.325019秒
(7)--进程ID为6212的进程执行完毕,耗时1.248071秒
(8)--进程ID为6476的进程执行完毕,耗时1.817104秒
-------end---------
* 刚开始有3个进程,执行完一个之后,后面的新进程添加进来,依次类推。谁先运行完,不一定。
* 这里`po.join()`阻塞程序执行,主进程和子进程都用print。如果没有,会看不到效果。
 
 from multiprocessing import Pool
import os,time,random #定义一个函数
def download(i):
print("(%d)--进程ID为%d的进程开始执行"%(i,os.getpid()))
t_start = time.time() time.sleep(2* random.random())
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() #等待进程池中所有子进程执行完成,阻塞必须放在close之后
print('-------end---------')
#同步时,输出的结果:
(0)--进程ID为5648的进程开始执行
(0)--进程ID为5648的进程执行完毕,耗时0.069004秒
(1)--进程ID为2556的进程开始执行
(1)--进程ID为2556的进程执行完毕,耗时1.278073秒
(2)--进程ID为1864的进程开始执行
(2)--进程ID为1864的进程执行完毕,耗时1.308075秒
(3)--进程ID为5648的进程开始执行
(3)--进程ID为5648的进程执行完毕,耗时1.673096秒
(4)--进程ID为2556的进程开始执行
(4)--进程ID为2556的进程执行完毕,耗时0.887051秒
(5)--进程ID为1864的进程开始执行
(5)--进程ID为1864的进程执行完毕,耗时1.699097秒
(6)--进程ID为5648的进程开始执行
(6)--进程ID为5648的进程执行完毕,耗时1.817104秒
(7)--进程ID为2556的进程开始执行
(7)--进程ID为2556的进程执行完毕,耗时0.595034秒
(8)--进程ID为1864的进程开始执行
(8)--进程ID为1864的进程执行完毕,耗时0.231013秒
(9)--进程ID为5648的进程开始执行
(9)--进程ID为5648的进程执行完毕,耗时1.656095秒
-------start---------
-------end---------

同步和异步的区别:

 

进程池_Pool的更多相关文章

  1. python进程池剖析(三)

    之前文章对python中进程池的原理.数据流以及应用从代码角度做了简单的剖析,现在让我们回头看看标准库中对进程池的实现都有哪些值得我们学习的地方.我们知道,进程池内部由多个线程互相协作,向客户端提供可 ...

  2. python进程池剖析(二)

    之前文章中介绍了python中multiprocessing模块中自带的进程池Pool,并对进程池中的数据结构和各个线程之间的合作关系进行了简单分析,这节来看下客户端如何对向进程池分配任务,并获取结果 ...

  3. python进程池剖析(一)

    python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...

  4. python进程池:multiprocessing.pool

    本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...

  5. 64位进程池HashCode兼容处理

    背景 net旧项目使用32位生成的HashCode,存储到数据库中.迁移到64位上,就需要对HashCode做兼容处理. 解决方案 1:进程池配置支持32位程序. 2:对Hashcode做兼容处理,[ ...

  6. Linux客户/服务器程序设计范式2——并发服务器(进程池)

    引言 让服务器在启动阶段调用fork创建一个子进程池,通过子进程来处理客户端请求.子进程与父进程之间使用socketpair进行通信(为了方便使用sendmsg与recvmsg,如果使用匿名管道,则无 ...

  7. PYTHON多进程编码结束之进程池POOL

    结束昨晚开始的测试. 最后一个POOL. A,使用POOL的返回结果 #coding: utf-8 import multiprocessing import time def func(msg): ...

  8. python(进程池/线程池)

    进程池 import multiprocessing import time def do_calculation(data): print(multiprocessing.current_proce ...

  9. python多进程,以及进程池并发

    模拟多进程 #!/usr/bin/env python#-*- coding:utf-8 -*-import timefrom multiprocessing import Process def s ...

随机推荐

  1. 【前端】CentOS 7 系列教程之二: 安装 git 最新版

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/linux_2.html 这一篇我们来安装git高版本. 卸载yum安装的旧版本 yum remove git 安装 ...

  2. redhat 关机注销命令详解

    一.注销,关机,重启 注销系统的logout命令 1,Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可: [root@localhost root]# ...

  3. checkbox设置单选的的两种方式

    一.如果 <input name="ck" type="checkbox">是页面加载就有的 $("#input[name=ck]&quo ...

  4. find 是区分大小写的。对于不区分大小写的写法(转载)

    转自:http://justwinit.cn/post/3633/ 默认情况下,find 是区分大小写的.对于不区分大小写的 find,将 -iname 测试替换为 -name 测试. find do ...

  5. float以后设置的小细节

    先看看下面这段css代码,是不是很完美?没错? #pageBodyMain .articleList a: after { content: ""; clear: both; di ...

  6. 与adb相关的问题,比如掉线问题、Android Studio 提示Session 'app':Error Installing APK、找不到设备

    这一篇帖子 会写的比较简单 不过相信大家也可能遇到这些问题   为了怕自己忘记  记录下来  顺便也和大家一起分享 描述:在一些机型上安装软件 提示卸载原先的软件  但是又安装不上新软件 DELETE ...

  7. POJ1050【DP】

    题意: 求一个最大子矩阵和. 思路: 枚举行区间,然后求一个最大子序列和. 贴一发挫code- #include <iostream> #include <cstdio> #i ...

  8. Jquery下拉框左右选择

    1.说明 本文demo实现下拉框左右选择,本文地址:http://www.cnblogs.com/lengzhan/p/6423023.html 2.代码 <!DOCTYPE html PUBL ...

  9. Python中lambda表达式的应用

    lambda表达式 Python中定义了一个匿名函数叫做lambda表达式,个人理解实现的作用就是代替一些简单的函数,使得代码看上去更简洁并且可读性高.举个例子,我们有一个元组列表[(‘a’,1),( ...

  10. 如何访问google?

    1:浏览器打开 uzer.me 网站(建议:火狐,不行就谷歌) 2:点击注册,注册一个账号 3:登录账号,进入如下界面,选择火狐浏览器 4:这样就可以进行国外的网站访问了