首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grequests的“内存泄漏”?

grequests的“内存泄漏”?
EN

Stack Overflow用户
提问于 2012-08-05 18:20:49
回答 3查看 1.6K关注 0票数 5

这是一个精简版本的脚本,导致内存使用量不断增加,我看到它在2分钟后超过600MB:

代码语言:javascript
复制
import requests
import grequests

lines = (grequests.get(l.strip(), timeout=15) for l in open('links.txt') if len(l.strip()))

for r in grequests.imap(lines, size=20):
    if r.ok:
        print r.url

links.txt是一个包含大量urls的文件,这个问题发生在我收集的几个大urls组中。在我看来,响应对象可能没有被推迟?

我今天更新了gevent,request和grequest,下面是它们的版本:

代码语言:javascript
复制
In [2]: gevent.version_info
Out[2]: (1, 0, 0, 'beta', 3)

In [5]: requests.__version__
Out[5]: '0.13.5'

grequests没有我能找到的版本号。

提前感谢您的回复。

EN

回答 3

Stack Overflow用户

发布于 2013-11-29 12:04:24

对于可能需要此link的人来说,此答案只是一个别名和链接。

我使用imap函数和requests.Session来减少内存使用,同时在我的脚本中发出380k请求。

票数 1
EN

Stack Overflow用户

发布于 2012-09-12 18:42:19

在我看来,这是因为你试图同时打开所有的链接。尝试如下所示:

代码语言:javascript
复制
links = set(links)
while links:
    calls = (grequests.get(links.pop()) for x in range(200)) 
    for r in calls:
        ...rest of your code

这段代码没有经过测试,你会找到更好的解决方案,这应该是你试图同时打开太多链接并导致内存消耗的证据。

票数 0
EN

Stack Overflow用户

发布于 2018-10-03 04:44:44

应该更新项目的请求库依赖项。

较旧版本的请求,包括问题示例中使用的请求,默认情况下不会预取任何响应内容,让您来使用数据。这将保留对底层套接字的开放引用,因此即使请求会话被垃圾收集,套接字也不会被垃圾收集,直到响应超出作用域或调用response.content

在更高版本的请求中,如果会话是为满足模块级get/post/etc请求而临时创建的,则默认情况下会预取响应,并且会话连接将显式关闭。这在requests GitHub issue #520中有介绍。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11815640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档