python processpoolexector 释放内存_python之ThreadPoolExecutor
在前面的博客中介绍了线程的用法,每次使用都要创建线程,启动线程,有没有什么办法简单操作呢。
python3.2引入的concurrent.future模块中有ThreadPoolExecutor和ProcessPoolExecutor两个类,这两个类内部维护着线程/进程池,以及要执行的任务队列,使得操作变得非常简单,不需要关心任何实现细节
来看一个简单的例子
#!/usr/bin/env python3.6
from concurrent.futures import ThreadPoolExecutor
import requests
import os
DEST_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "download")
BASE_URL = "http://flupy.org/data/flags"
CC_LIST = ("CN", "US", "JP", "EG")
if not os.path.exists(DEST_DIR):
os.mkdir(DEST_DIR)
def get_img(cc):
url = "{}/{cc}/{cc}.gif".format(BASE_URL, cc=cc.lower())
response = requests.get(url)
return response.content
def save_img(img, filename):
path = os.path.join(DEST_DIR, filename)
with open(path, 'wb') as f:
f.write(img)
def download_one(cc):
img = get_img(cc)
save_img(img, cc.lower() + ".gif")
return cc
def download_many(cc_list):
works = len(cc_list)
with ThreadPoolExecutor(works) as exector: # 使用with来管理ThreadPoolExecutor
# map方法和内置的map方法类似,不过exector的map方法会并发调用,返回一个由返回的值构成的生成器
response = exector.map(download_one, cc_list)
return len(list(response))
if __name__ == "__main__":
download_many(CC_LIST)
Future
concurrent.futures和asyncio中的Future类的作用相同,****都表示可能己经完成或尚未完成的延迟计算****
Future封装待完成的操作,可以放入队列,完成的状态可以查询,得到结果后可以获取结果
使用exector.submit()方法提交执行的函数并获取一个Future,而不是直接创建,传入的参数是一个可调用的对象;获取的Future对象有一个done()方法,判断该Future是否己完成, add_one_callback()设置回调函数, result()来获取Future的结果。as_completed()传一个Future列表,在Future都完成之后返回一个迭代器
使用submit()方法试试看
def download_many(cc_list):
with ThreadPoolExecutor(max_workers=5) as exector:
future_list = []
for cc in cc_list:
# 使用submit提交执行的函数到线程池中,并返回futer对象(非阻塞)
future = exector.submit(download_one, cc)
future_list.append(future)
print(cc, future)
result = []
# as_completed方法传入一个Future迭代器,然后在Future对象运行结束之后yield Future
for future in futures.as_completed(future_list):
# 通过result()方法获取结果
res = future.result()
print(res, future)
result.append(res)
return len(result)
>>>
CN
US
JP
EG
JP
CN
EG
US
ProcessPoolExecutor的使用方法是一样的,唯一需要注意的区别是传入的max_workers这个参数对于ProcessPoolExecutor是可选的,在不使用的情况下默认值是os.cpu_count()的返回值(cpu的数量)
exector.submit()和futures.as_completed()这个组合比exector.map()更灵活,submit()可以处理不同的调用函数和参数,而map只能处理同一个可调用对象。
wait()阻塞主线程,直到所有task都完成。
python processpoolexector 释放内存_python之ThreadPoolExecutor相关推荐
- python processpoolexector 释放内存_关于python:如何在multiprocessing.queue中从Process中释放内存?...
我有一个程序试图预测一周内发送的每封电子邮件的电子邮件转换(因此,通常是7封). 输出是7个不同的文件,每个客户的预测得分. 串行运行这些可能需要8个小时,因此我尝试使用multiprocessing ...
- python 手动释放内存_Python手动清理内存
写程序这方面,自己不是科班出身,本科时唯一的C语言课也没有好好听讲.导致后来写代码的时候十分不规范,也缺失了许多细节,日常遇到的自己给自己挖的坑还是有必要记录一下,方便以后复盘. 就像现在,前脚写完的 ...
- python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器
在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...
- python processpoolexector 释放内存_使用Python的multiprocessing.pool,内存使用量不断增长...
这是程序: #!/usr/bin/python import multiprocessing def dummy_func(r): pass def worker(): pass if __name_ ...
- python线程执行完后释放内存_python变量内存地址释放与加速并行计算多线程
1.导入numba和gc包进行并行计算和内存释放 代码如下很容易的: #coding:utf-8 import time from numba import jit, prange, vectoriz ...
- python变量分配内存_Python | 声明任何变量而不分配任何值
python变量分配内存 Since, Python is a dynamic programming language so there is no need to declare such typ ...
- python太占内存_Python占用的内存优化教程
概述 如果程序处理的数据比较多.比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题.下面我就 ...
- python线程执行完后释放内存_Python中的线程终止与内存释放
但我注意到,内存并没有释放(gc.get_objects()不断增长).实际上,这些对象是列表.dict等,而不是文件.在 有没有办法手动释放资源? 代码:import ctypes def term ...
- python连接redis集群如何释放内存_python 连接redis集群
连接单个节点 单个的直接导入redis模块,设置ip,密码,端口,直接连就OK了 #python 2.7.x #redis (2.10.6) import redis def connRedis(): ...
最新文章
- 如何调整金格电子章服务器印章_大型集团公司的印章管理方法
- c语言程序设计复习提纲,C语言程序设计复习提纲
- 在项目中寻找代码的坏味道(命名)
- Python自动化运维之常用模块—OS
- Pandas MultiIndex(多重索引)
- svd奇异值分解_Lecture 28 | 奇异值分解
- VMware和Centos安装使用
- 驱动INF文件解析和 为自己的设备安装指定驱动
- 【计算机软件基础】如何理解鲁棒性Robust?
- 加速计.陀螺仪的使用
- MBTI职业倾向测验
- 电信无限流量卡无服务器,电信无限流量卡实测 牟足劲一天刷30GB
- 720度全景场景HTML5源码,直接在浏览器中运行
- GitHub数据库榜单第一:Redis核心原理实践PDF,点赞已过百万+
- air flow空调上是什么意思_airflow空调滤芯上是什么意思
- 用javascript绘制点线数据
- MFC 绘制半透明图片
- 【FederatedLearning】联邦学习类别详述(横向、纵向、迁移)
- 一键分析Android的BugReport
- 巧妙地用继电器实现直流电机正反转