当需要创建子进程数量不多的时候,可以直接利用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. 【TJOI2013】 单词

    [题目链接] 点击打开链接 [算法] AC自动机+递推 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 200 ...

  2. bzoj 2836 魔法树 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树链剖分裸题: 写码五分钟,调码两小时,RE不断,狂交二十五遍,终于找到一处小细节—— ...

  3. CTR预估经典模型总结

    计算广告领域中数据特点:    1 正负样本不平衡    2 大量id类特征,高维,多领域(一个类别型特征就是一个field,比如上面的Weekday.Gender.City这是三个field),稀疏 ...

  4. MariaDB + Visual Studio 2017 环境下的 ODBC 入门开发

    参考: Easysoft公司提供的ODBC教程 微软提供的ODBC文档 环境: Windows 10 x64 1803 MariaDB TX 10.2.14 x64 MariaDB ODBC Conn ...

  5. #define WM_COMM_BREAK_DETECTED WM_USER+1

    一.#define WM_COMM_BREAK_DETECTED WM_USER+1定义一个用户自定义消息WM_COMM_BREAK_DETECTED,它是自定义消息,非系统消息 为了防止用户定义的消 ...

  6. django上课笔记7-jQuery Ajax 和 原生Ajax-伪造的Ajax-三种Ajax上传文件方法-JSONP和CORS跨域资源共享

    一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...

  7. python学习笔记2-条件语句

    #条件语句 ''' if 判断条件: 执行语句…… else: 执行语句…… ''' flag = False name = 'python' if name == 'python': # 判断变量否 ...

  8. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时26&&27

    课时26 图像分割与注意力模型(上) 语义分割:我们有输入图像和固定的几个图像分类,任务是我们想要输入一个图像,然后我们要标记每个像素所属的标签为固定数据类中的一个 使用卷积神经,网络为每个小区块进行 ...

  9. 笔记-JavaWeb学习之旅3

    数据库的设计 1.多表之间的关系 一对一 一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键 一对多 在多的一方建立外键指向一的一方建立主键 多对多 多对多关系实现需要借助第三张中间表.中间表 ...

  10. iOS NSUserDefaults [setValue:forKey:] [setObject:forKey:] <Objc> setValue(_,forKey:) set(_,forKey) <Swift 3>

    前者其实是NSObject都可以调用的KVC方法,后者才是NSUserDefaults的实例方法: 这里参数的类型是nullable id,但是我建议你在传null的时候慎重考虑,否则你的应用就可能面 ...