先说结论:

在使用多线程时,不要使用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. 用JavaMail通过QQ邮箱来发送邮件(第一篇博客,备忘)

    1.先启用QQ邮箱里POP3/STMP服务:生成授权码 2.导入mail.jar包(不要用太古董的技术,你懂得) 3.注意要在代码里加上开启SSL加密的代码 4.直接上代码 import java.u ...

  2. border-radius图解

    自己看了理解的border-radius: 设置参数: 100*100的正方形,第一个:border-top-left-radius:100px 100px,即圆的半径为100px.圆弧与上和左bor ...

  3. day 3 - 1 数据类型

    什么是数据类型: int 1,2,3用于计算. bool:True,False,用户判断. str:存储少量数据,进行操作 'fjdsal' '二哥','`13243','fdshklj' '战三,李 ...

  4. .net+mvc,ueditor

    .net+mvc的百度编辑器ueditor 一.下载百度编辑器:http://ueditor.baidu.com/website/download.html 选择.net版本 二.解压后在mvc项目中 ...

  5. vue 学习笔记—Es6

    // 第一部分 /* console.log(a+'c'); var a = 1; console.log(b+'c'); let b =1; */ // 上述代码 left定义报错 原因: /* v ...

  6. Aizu 2170 Marked Ancestor

    题意:出一颗树,有两种操作:1. mark  u  标记结点u2.query  u  询问离u最近的且被标记的祖先结点是哪个让你输出所有询问的和. 思路:数据量太小,直接暴力dfs就可以了 #incl ...

  7. redis-LinkedList

    1.redis-LinkedList[重点] Java List :  数组ArrayList 链表LinkedList 为什么redis选取了链表? Redis操作中,最多的操作是进行元素的增删 使 ...

  8. python第六天函数,定义、调用、不带参函数、带参函数等

    在python定义函数需要用到的关键字是 def  xxxx():,这个关键字就是 defined 的缩写.具体看实例: >>> def hello(): print("你 ...

  9. 刷题之路第三题--Longest Substring Without Repeating Characters

    问题简介:求给定字符串中最长的字符不重复的字符串的长度 问题详解: 给定一个字符串,寻找给定字符串中包含的最长的字符不重复的字符串的长度 注:答案必须是子字符串,不是子序列 是连续的字符不重复的字符串 ...

  10. 在Apache Struts中利用OGNL注入

    前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...