在前面的博客中介绍了线程的用法,每次使用都要创建线程,启动线程,有没有什么办法简单操作呢。

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相关推荐

  1. python processpoolexector 释放内存_关于python:如何在multiprocessing.queue中从Process中释放内存?...

    我有一个程序试图预测一周内发送的每封电子邮件的电子邮件转换(因此,通常是7封). 输出是7个不同的文件,每个客户的预测得分. 串行运行这些可能需要8个小时,因此我尝试使用multiprocessing ...

  2. python 手动释放内存_Python手动清理内存

    写程序这方面,自己不是科班出身,本科时唯一的C语言课也没有好好听讲.导致后来写代码的时候十分不规范,也缺失了许多细节,日常遇到的自己给自己挖的坑还是有必要记录一下,方便以后复盘. 就像现在,前脚写完的 ...

  3. python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器

    在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...

  4. python processpoolexector 释放内存_使用Python的multiprocessing.pool,内存使用量不断增长...

    这是程序: #!/usr/bin/python import multiprocessing def dummy_func(r): pass def worker(): pass if __name_ ...

  5. python线程执行完后释放内存_python变量内存地址释放与加速并行计算多线程

    1.导入numba和gc包进行并行计算和内存释放 代码如下很容易的: #coding:utf-8 import time from numba import jit, prange, vectoriz ...

  6. python变量分配内存_Python | 声明任何变量而不分配任何值

    python变量分配内存 Since, Python is a dynamic programming language so there is no need to declare such typ ...

  7. python太占内存_Python占用的内存优化教程

    概述 如果程序处理的数据比较多.比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题.下面我就 ...

  8. python线程执行完后释放内存_Python中的线程终止与内存释放

    但我注意到,内存并没有释放(gc.get_objects()不断增长).实际上,这些对象是列表.dict等,而不是文件.在 有没有办法手动释放资源? 代码:import ctypes def term ...

  9. python连接redis集群如何释放内存_python 连接redis集群

    连接单个节点 单个的直接导入redis模块,设置ip,密码,端口,直接连就OK了 #python 2.7.x #redis (2.10.6) import redis def connRedis(): ...

最新文章

  1. 如何调整金格电子章服务器印章_大型集团公司的印章管理方法
  2. c语言程序设计复习提纲,C语言程序设计复习提纲
  3. 在项目中寻找代码的坏味道(命名)
  4. Python自动化运维之常用模块—OS
  5. Pandas MultiIndex(多重索引)
  6. svd奇异值分解_Lecture 28 | 奇异值分解
  7. VMware和Centos安装使用
  8. 驱动INF文件解析和 为自己的设备安装指定驱动
  9. 【计算机软件基础】如何理解鲁棒性Robust?
  10. 加速计.陀螺仪的使用
  11. MBTI职业倾向测验
  12. 电信无限流量卡无服务器,电信无限流量卡实测 牟足劲一天刷30GB
  13. 720度全景场景HTML5源码,直接在浏览器中运行
  14. GitHub数据库榜单第一:Redis核心原理实践PDF,点赞已过百万+
  15. air flow空调上是什么意思_airflow空调滤芯上是什么意思
  16. 用javascript绘制点线数据
  17. MFC 绘制半透明图片
  18. 【FederatedLearning】联邦学习类别详述(横向、纵向、迁移)
  19. 一键分析Android的BugReport
  20. 巧妙地用继电器实现直流电机正反转

热门文章

  1. Python——分布式监控项目
  2. 问题记录:EntityFramework 一对一关系映射
  3. 含绝对值不等式的证明
  4. Quartz2D简单绘制之矩形椭圆
  5. 拥有所有归档文件,但没有备份情况下的数据文件恢复
  6. leetcode 1160 python
  7. java中能对属性封装吗_JAVA中的封装
  8. ORA-15096: lost disk write detected的解决与修复
  9. 数据3分钟丨《数据库发展研究报告(2021年)》发布;PingCAP完成新一轮融资
  10. 了解 MongoDB 看这一篇就够了