先说结论:

在使用多线程时,不要使用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之 string 和 random方法

    1. import string import string print(string.ascii_lowercase) #输出全部小写字母a-z print(string.ascii_letters ...

  2. 遍历系统中所有的进程,可根据名字或ID查找某一个线程

    我们这根据名字查找进程,获取其ID /*@brief 获取找到的与指定进程名相符的第一个进程ID * @param [in] cpszExeFileName 进程可执行文件名(不带路径) * @par ...

  3. Python Tornado简介

    简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  4. 高性能IO之Reactor模式

    The reactor design pattern is an event handling pattern for handling service requests delivered conc ...

  5. retrofit动态代理

    https://blog.csdn.net/dalong3976/article/details/83479816

  6. 【Math for ML】矩阵分解(Matrix Decompositions) (下)

    [Math for ML]矩阵分解(Matrix Decompositions) (上) I. 奇异值分解(Singular Value Decomposition) 1. 定义 Singular V ...

  7. truncate、delete、drop区别

    语法: truncate table 表名 delete from 表名 drop table 表名 应用范围: truncate 只能对表,且不能用于参与了索引的表,不能用于外键约束引用的表 del ...

  8. MySQL触发器trigger的使用

    https://www.cnblogs.com/geaozhang/p/6819648.html 触发器的触发 语句的错误 和 触发器里面 错误 都不会运行 NEW与OLD详解 MySQL 中定义了 ...

  9. 【转】HTTP

    [转]HTTP 一.http概述 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTT ...

  10. Windows PowerShell 入門(2)-基本操作編 2

    前回に引き続きMicrosoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.基本操作編第2弾の今回は.パイプの使用方法を中心としたコマンドレットの操作方 ...