python3 urllib 内存泄露_【python】【Memory leak】urllib2, request内存泄露问题解决方案...

本文探讨了Python 2.7中urllib2和requests库在网络请求后可能出现的内存泄漏问题,并提供了临时解决方案,即结合urllib和contextlib.closing以避免内存占用。作者通过实例展示了如何使用gc库检测内存泄漏,并推荐了urllib+contextlib.closing的组合来确保内存有效回收。
摘要由CSDN通过智能技术生成

提到python,很多人的第一直觉大概就是爬虫和网络相关。然而最近使用python2.7 urllib2和request的时候却无意中发现可能存在严重的内存泄漏问题,或者说垃圾回收有问题。stackoverflow了一下,确实有很多人反应了相关的问题,至今还没解决。综合了各种解决方案,最终确定了一种临时的替代方案,在此记录和分享。

用过python进行大量网络请求的童鞋,可能都会发现,当请求达到一定量之后会出现内存问题,无法再进行请求。下面,我们用利用python内置的gc库看一下urllib2和request请求过后的内存回收情况。 import gc, urllib, urllib2, requests def get_unreachable_memory_len(): # check memory on memory leaks gc.set_debug(gc.DEBUG_SAVEALL) gc.collect() unreachableL = [] for it in gc.garbage: unreachableL.append(it) print str(unreachableL) return len(str(unreachableL)) def request_with_urllib2(url): resp = urllib2.urlopen(url) return resp.read() def request_with_requests(url): resp = requests.get(url) return resp.content

启动python,先调用一下get_unreachable_memory_len()看一下当前有没有内存泄露:

429541650d4e7db9d62a917e4db09bdb.png

返回是为空,证明没有memory leak.

运行request_with_urllib2('http://www.ah.xinhuanet.com/titlepic/1117418255_1449717108394_title1n.jpg')之后我们拿到了长度为41536的胡歌歌的照片:

8918a07cfe318fc0b167d8a03d9e9e2e.png 但不幸的是,我们看内存:

1528185224335303.png

由于网络请求没有被正确回收,导致内存出现了一定的泄露,这部分泄露是response中没有被处理的部分。

同理我们再试一下request_with_requests('http://www.ah.xinhuanet.com/titlepic/1117418255_1449717108394_title1n.jpg')

a1cb979b8caa2a52450b44169ec3d7f5.png

1528185238641490.png

同样,在进行requests.get后,内存回收也出现了问题。

在若干次实验后,终于找到了较为理想的解决方案,也就是暂时用urllib+contextlib.closing的组合进行临时替代。这样可以在不换掉python2.7的条件下,实现不伤害内存的网络请求。 from contextlib import closing def url_request(url): # request without memory leak res = None with closing(urllib.urlopen(url)) as resp: res = resp.read() return res

同样的方法,我们来试一下这种方案。(注意此处要重启一个新的python shell测试哦~) get_unreachable_memory_len() url_request('http://www.ah.xinhuanet.com/titlepic/1117418255_1449717108394_title1n.jpg') get_unreachable_memory_len()

3d821cb6583ce38062ea85fb76ea23cb.png

从图片中我们可以清楚的看到,通过url_request我们不仅获取了胡歌歌的大图,还完成了完整的response回收,通过gc检查内存也没有任何问题。妥妥的解决~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值