我对所有这些都很陌生;我需要为我正在撰写的一篇论文获取数千个sourceforge项目的数据。这些数据都可以在url http://sourceforge.net/api/project/name/[project name]/json上以json格式免费获得。我有一个几千个这些网址的列表,我使用以下代码。
import grequests
rs = (grequests.get(u) for u in ulist)
answers = grequests.map(rs)
使用这段代码,我可以获得任何200个左右我喜欢的项目的数据,即rs = (grequests.get(u) for u in ulist[0:199])
工作,但是只要我回顾一下,所有的尝试都会遇到
ConnectionError: HTTPConnectionPool(host='sourceforge.net', port=80): Max retries exceeded with url: /api/project/name/p2p-fs/json (Caused by <class 'socket.gaierror'>: [Errno 8] nodename nor servname provided, or not known)
<Greenlet at 0x109b790f0: <bound method AsyncRequest.send of <grequests.AsyncRequest object at 0x10999ef50>>(stream=False)> failed with ConnectionError
在退出python之前,我无法再发出任何请求,但只要重新启动python,我就可以再发出200个请求。
我试过使用grequests.map(rs,size=200)
,但这似乎没有任何作用。
这个可以很容易地更改为使用任意数量的连接。
所以,我在这里回答,也许它会帮助其他人。
在我的例子中,这不是目标服务器的速率限制,而是更简单的事情:我没有显式地关闭响应,因此它们保持套接字打开,python进程没有文件句柄。
我的解决方案(不确定哪一个解决了这个问题——理论上他们两个都应该这么做)是:
在
grequests.get
中设置stream=False
:读取response.content后显式调用
response.close()
:注意:仅仅销毁
response
对象(将None
分配给它,调用gc.collect()
)是不够的-这没有关闭文件处理程序。相关问题 更多 >
编程相关推荐