先说结论:

在使用多线程时,不要使用threadpool,应该使用threading, 尤其是数据量大的情况。因为threadpool会导致严重的内存占用问题!

对比threading和threadpool的内存占用

# coding=utf-8

import time
import os
import psutil
import json
import threadpool
import threading class TEST(object):
# 获取数据,使用yield, 每次返回一个len=10的list, list中的每一项是一个线程的数据
def get_data(self):
multi_list = list()
for i in range(100):
data = "abcdefg" * 100000
multi_list.append(data)
if len(multi_list) % 10 == 0:
yield multi_list
multi_list = list() # 测试函数
def test(self):
for data in self.get_data():
mem = psutil.Process(os.getpid()).memory_info().rss
print "[test] mem %s" % mem # 打印内存占用情况
self.deal_threadpool(data) # 使用threadpool
# self.deal_multi_thread(data) # 使用threading # 待对比方法,threadpool
def deal_threadpool(self, data_list):
pool = threadpool.ThreadPool(10)
requests = threadpool.makeRequests(self.sub_task, data_list)
[pool.putRequest(req) for req in requests]
pool.wait() # 待对比方法,threading
def deal_multi_thread(self, data_list):
threads = list()
for data in data_list:
threads.append(threading.Thread(target=self.sub_task, args=(data,)))
for t in threads:
t.start()
for t in threads:
t.join() def sub_task(self, data):
return if __name__ == "__main__":
mem = psutil.Process(os.getpid()).memory_info().rss
print "[main] mem %s" % mem
obj = TEST()
obj.test()
mem = psutil.Process(os.getpid()).memory_info().rss
print "[main] mem %s" % mem

结果:

1. 使用threadpool时

[main] mem 9760768
[test] mem 16764928
[test] mem 23924736
[test] mem 26820608
[test] mem 29720576
[test] mem 31911936
[test] mem 34795520
[test] mem 36978688
[test] mem 39161856
[test] mem 41340928
[test] mem 43524096
[main] mem 43606016

2. 使用threading时

[main] mem 9760768
[test] mem 16764928
[test] mem 23838720
[test] mem 16969728
[test] mem 23838720
[test] mem 16969728
[test] mem 23838720
[test] mem 16973824
[test] mem 23842816
[test] mem 16973824
[test] mem 23842816
[main] mem 16973824

对比可以看出,

使用threading时,每次线程退出可以正确的释放内存,内存占用的最大值很稳定。

使用threadpool时,每次线程退出后内存都没有释放,而是一直累加。在我实际使用的过程中,从mongo获取了大量的数据,threadpool在处理过程中占用的内存高达50g,而使用threading后内存占用稳定在了1g.

【python】threadpool的内存占用问题的更多相关文章

  1. python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...

  2. Python 获得对象内存占用内存大小 sys.getsizeof

    from sys import getsizeof class A(object): pass class B: pass for x in (None, 1, 1L, 1.2, 'c', [], ( ...

  3. Python读取大文件的"坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

  4. [转] python运行时内存分析工具meliae

    转自:https://my.oschina.net/markco/blog/601773 利用meliae来监控python进程的内存占用情况 meliae是一个python进程内存占用监控.分析工具 ...

  5. android应用内存占用测试(每隔一秒打印procrank的信息)

    1.内存占用 对于智能手机而言,内存大小是固定的:因此,如果单个app的内存占用越小,手机上可以安装运行的app就越多:或者说app的内存占用越小,在手机上运行就会越流畅.所以说,内存占用的大小,也是 ...

  6. 记录特殊情况的Python脚本的内存异常与处理

    问题 Python 脚本使用 requests 模块做 HTTP 请求,验证代理 IP 的可用性,速度等. 设定 HTTP 请求的 connect timeout 与 read response ti ...

  7. Windbg分析高内存占用问题

    1. 问题简介 最近产品发布大版本补丁更新,一商超客户升级后,反馈系统经常奔溃,导致超市的收银系统无法正常收银,现场排队付款的顾客更是抱怨声声.为了缓解现场的情况, 客户都是手动回收IIS应用程序池才 ...

  8. 【转】Python之mmap内存映射模块(大文本处理)说明

    [转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...

  9. Python 用ctypes观察Python对象的内存结构 -- (转)

    !!!强烈推荐的好文章!!! 对象的两个基本属性 Python所有对象结构体中的头两个字段都是相同的: refcnt:对象的引用次数,若引用次数为0则表示此对象可以被垃圾回收了. typeid:指向描 ...

随机推荐

  1. python之字符串常用的方法

    1. 去掉空格或换行符 s='. hello .world .\n' new_s = s.strip()#默认去掉字符串前后的空格和换行符 new_s = s.strip('.')#可传参去掉字符串前 ...

  2. 【mmall】url-pattern配置为"/"和"/*"的区别

    我的代码 <!-- springmvc --> <servlet> <servlet-name>springmvc</servlet-name> < ...

  3. 【tmos】字段create_time如何动态的生成

    1.数据库create_time字段默认值设置为CURRENT_TIMESTAMP,实体类中不映射createTime字段,在用jpa的save()方法时,会自动生成,如果你传了null值到数据库,是 ...

  4. python基础知识~备份还原功能设计

    一 相关模块设计 1 配置文件管理模块 configparser    1 config-value不要加引号 2 linux系统执行命令模块 subprocess   1 shell=True代表命 ...

  5. centos 秘钥登陆配置

    准备:2台机器,ip分别为:10.1.80.13     10.1.80.14 目的:通过13 ssh远程访问14.无需输入密码 1.首先在10.1.80.13上生成密钥对.cd /root/.ssh ...

  6. launch 文件的写法

    1. launch文件的写法 ❀标签          ☺<node> 启动一个节点          ☺ <param> 设置参数服务器的参数          ☺ < ...

  7. C++基础题--float型以整型格式输出

    int main() { ; a++; printf("%d\n", a); system("pause"); ; } //为什么会输出是0? 解释如下: 在p ...

  8. TensorFlow学习笔记:保存和读取模型

    TensorFlow 更新频率实在太快,从 1.0 版本正式发布后,很多 API 接口就发生了改变.今天用 TF 训练了一个 CNN 模型,结果在保存模型的时候居然遇到各种问题.Google 搜出来的 ...

  9. SpringCloud Feign

    ⒈Feign是什么? Feign是Netflix开发的声明式.模板化的HTTP客户端, Feign可以帮助我们更快捷.优雅地调用HTTP API. SpringCloud微服务项目之间调用是通过Res ...

  10. HDFS-put: unexpected URISyntaxException

    目的:将某zip上传到HDFS某目录 [hdfs@mr1 jars]$ hadoop fs -put "20180720_155245 label.zip" /user/File/ ...