python进程池与线程池
为什么会进行池化?
一切都是为了效率,每次开启进程都会分配一个属于这个进程独立的内存空间,开启进程过多会占用大量内存,系统调度也会很慢,我们不能无限的开启进程。
进程池原来大概如下图
假设有100个任务 ,如果不使用进程池就需要创建100个进程。但是使用进程池假设进程池里有25个进程,那么100个任务 每个都从进程池分配一个进程执行,如果进程池为空就会等待别的任务完成归还进程再分配进程执行任务。
更高级的进程池,会根据任务数量自动收缩和扩充进程池大小,不过python暂时不具备。我猜的原因是因为python效率过低自动化进程池收缩和分配进程会严重影响效率还不如固定大小的进程池效率高。不过可以可以写一个C语言的自动化进程池再联合编程为python模块=。=最近已经在研究C语言希望能搞一搞。
python池化模块
python3.2版本发布的concurrent.futures 模块 ,可以用来生成进程池和线程池。 也可以直接使用multiprocessing.Pool 这里不多介绍了。建议使用前一个毕竟都是标准库模块前一个功能更强。
ProcessPoolExecutor进程池
ThreadPoolExecutor线程池 基本方法:
submit(fn,*args,**kwargs) 异步提交任务 需要使用for循环提交多个任务 map(func,*iterables,timeout=None,chunksize=1) 取代for循环submit的操作 shutdown(wait=True) 相当于进程池pool.close()+pool.join() 操作,wait=True等待池内所有任务执行完毕回收完资源后才继续否则立即返回。但是不管wait为何值程序都会等等所有任务执行完毕。
submit和map必须在shutdown之前 result(timeout=None)取回结果 add_done_callback(fn) 回调函数
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor def fun1(i):
print(i) if __name__ == "__main__":
p = ProcessPoolExecutor(max_workers=) #进程池 for i in range():
p.submit(fun1,i) p.shutdown() #回收完所有进程才向下执行 t = ThreadPoolExecutor(max_workers=) #线程池
for item in range():
t.submit(fun1,item)
print("主进程结束")
拿到返回值
from concurrent.futures import ProcessPoolExecutor def fun1(i):
return i if __name__ == "__main__":
p = ProcessPoolExecutor(max_workers=5) #进程池 p_lst = []
for i in range(100):
pn = p.submit(fun1,i)
p_lst.append(pn)
p.shutdown() #回收完所有进程才向下执行 result_lst = [task.result() for task in p_lst]
print(result_lst) #返回值列表
使用回调函数
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor def fun1(i):
return i def call_back(m): #回调函数传入的参数是任务的返回值
print("结果是%d"%m.result()) #处理任务的返回值 if __name__ == "__main__":
p = ProcessPoolExecutor(max_workers=5) #进程池 p_lst = [] for i in range(100):
pn = p.submit(fun1,i).add_done_callback(call_back) #添加回调函数
p_lst.append(pn) p.shutdown() #回收完所有进程才向下执行 print("主进程结束")
使用上下文管理器
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor def fun1(i):
print(i) if __name__ == "__main__":
with ProcessPoolExecutor(max_workers=5) as p: #进程池
for i in range(10):
p.submit(fun1,i) with ThreadPoolExecutor(max_workers=5) as t: #线程池
for i in range(10):
t.submit(fun1, i)
使用map方法处理任务
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor def fun1(i):
print(i)
return i*i if __name__ == "__main__":
with ProcessPoolExecutor(max_workers=5) as p: #进程池
results = p.map(fun1,range(10)) #map的可迭代对象参数的每个值都传入函数执行 for result in results:
print(result) #拿到map的返回值
python进程池与线程池的更多相关文章
- python系列之 - 并发编程(进程池,线程池,协程)
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- python并发编程之进程池,线程池,协程
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- python自带的进程池及线程池
进程池 """ python自带的进程池 """ from multiprocessing import Pool from time im ...
- Python并发编程之线程池/进程池--concurrent.futures模块
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...
- python并发编程之进程池,线程池concurrent.futures
进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- python之进程池与线程池
一.进程池与线程池介绍 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时就应该 ...
- python自带的线程池和进程池
#python自带的线程池 from multiprocessing.pool import ThreadPool #注意ThreadPool不在threading模块下 from multiproc ...
- Python并发编程之进程池与线程池
一.进程池与线程池 python标准模块concurrent.futures(并发未来) 1.concurrent.futures模块是用来创建并行的任务,提供了更高级别的接口,为了异步执行调用 2. ...
- Python 37 进程池与线程池 、 协程
一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...
随机推荐
- 玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(设备自注册)+ Android App控制
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- Arduino学习笔记② Arduino语言基础
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- HTTP协议详解(一)——初识HTTP及请求
何为HTTP(超文本传输协议)? 协议,即约定俗成的规范.HTTP则是浏览器与服务器之间交流的一种规范.HTTP基于TCP/IP协议,属于应用层的协议. 为什么Web应用不使用TCP或者UDP协议呢? ...
- LeetCode 1: single-number
Given an array of integers, every element appears twice except for one. Find that single one. soluti ...
- java中多线程 - 多线程中的基本方法
介绍一下线程中基本的方法使用 线程睡眠sleep() Thread.sleep(毫秒);我们可以通过sleep方法设置让线程睡眠.可以看到sleep是个静态方法 public static nativ ...
- LeetCode 5024 除数博弈 --(简单博弈论)
今天在LeetCode的看到一到题目 这道题目有点坑,没有思路的话容易钻牛角. 刚刚开始时,我想的是直接用while循环来模拟计算,后来觉得这么好麻烦,也有复制的逻辑在里面.后面我推导了一下 以下是我 ...
- JS-SDK
1. 签名 看到网上的大部分问题都集中在签名部分,请大家一定请熟读微信JS-SDK说明文档附录5-常见错误及解决方法 部分. 注意 在计算签名的过程中,如果url总是不对请 实验 首页的url或 ...
- django-模板之for empty(十一)
当值为空时,会调用empty下面的值
- 2018.8.20 Python之路---常用模块
一.re模块 查找: re.findall(‘正则表达式’,‘字符串’) 匹配所有符合正则表达式的内容,形成一个列表,每一项都是列表中的一个元素. ret = re.findall('\d+','sj ...
- Splash的使用
Splash Lua脚本http://localhost:8050 入口及返回值 function main(splash, args) splash:go("http://www.baid ...