为什么会进行池化?

一切都是为了效率,每次开启进程都会分配一个属于这个进程独立的内存空间,开启进程过多会占用大量内存,系统调度也会很慢,我们不能无限的开启进程。

进程池原来大概如下图

假设有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进程池与线程池的更多相关文章

  1. python系列之 - 并发编程(进程池,线程池,协程)

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  2. python并发编程之进程池,线程池,协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  3. python自带的进程池及线程池

    进程池 """ python自带的进程池 """ from multiprocessing import Pool from time im ...

  4. Python并发编程之线程池/进程池--concurrent.futures模块

    一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...

  5. python并发编程之进程池,线程池concurrent.futures

    进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...

  6. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  7. python之进程池与线程池

    一.进程池与线程池介绍 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时就应该 ...

  8. python自带的线程池和进程池

    #python自带的线程池 from multiprocessing.pool import ThreadPool #注意ThreadPool不在threading模块下 from multiproc ...

  9. Python并发编程之进程池与线程池

    一.进程池与线程池 python标准模块concurrent.futures(并发未来) 1.concurrent.futures模块是用来创建并行的任务,提供了更高级别的接口,为了异步执行调用 2. ...

  10. Python 37 进程池与线程池 、 协程

    一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...

随机推荐

  1. 整洁的 Table View 代码

    Table view 是 iOS 应用程序中非常通用的组件.许多代码和 table view 都有直接或间接的关系,随便举几个例子,比如提供数据.更新 table view,控制它的行为以及响应选择事 ...

  2. uni-app 请求封装

    1.创建一个http.js ​ const baseUrl = 'http://192.168.1.188:8080'; const httpRequest = (opts, data) => ...

  3. 轻量级CNN模型mobilenet v1

    mobilenet v1 论文解读 论文地址:https://arxiv.org/abs/1704.04861 核心思想就是通过depthwise conv替代普通conv. 有关depthwise ...

  4. UnityWebRequest_ZT

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  5. js更高文档的样式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. C语言中为什么float型数据的范围是3.4E-38~3.4E+38

    因为float所占的位数决定了他的大小位数就是计算机的存储所需要的bit多少32位浮点,64位双精度浮点范围不同//////////////////////以前学计算系统基础的时候有这么个说法计算机存 ...

  7. Vue + Mui

    概述 Vue套用Mui的外壳开发app项目,可以通过Mui的 manifest.json 文件添加权限 1.新建Mui项目 首先,新建一个空的Mui项目 window.location.href = ...

  8. $POJ2942\ Knights\ of\ the\ Round\ Table$ 图论

    正解:图论 解题报告: 传送门! 一道,综合性比较强的题(我是萌新刚学$OI$我只是想练下$tarjan$,,,$QAQ$ 考虑先建个补图,然后现在就变成只有相互连边的点不能做邻居.所以如果有$K$个 ...

  9. 深入理解Kafka必知必会(上)

    Kafka的用途有哪些?使用场景如何? 消息系统: Kafka 和传统的消息系统(也称作消息中间件)都具备系统解耦.冗余存储.流量削峰.缓冲.异步通信.扩展性.可恢复性等功能.与此同时,Kafka 还 ...

  10. 为什么磁盘慢会导致Linux负载飙升?

    一.CPU利用率和负载率的区别 这里要区别CPU负载和CPU利用率,它们是不同的两个概念,但它们的信息可以在同一个top命令中进行显示.CPU利用率显示的是程序在运行期间实时占用的CPU百分比,这是对 ...