1

我有一个包含 3 亿个 url 的列表。我需要使用这个 url 调用异步 rest api 调用。我不需要响应。我试图用twisted来实现这个。当列表增长超过1000个url时我收到错误。请建议我如何实现

Please find my code 

# start of my program
from twisted.web import client
from twisted.internet import reactor, defer
#list of urls to be invoked
urls = [
 'http://test.com/apiname/?s=85465&ts=1370591808', 
 'http://test.com/apiname/?s=85465&ts=1370591808', 
 'http://test.com/apiname/?s=85465&ts=1370591808', 
 'http://test.com/apiname/?s=85465&ts=1370591808', 
 'http://test.com/apiname/?s=85465&ts=1370591808', 
 'http://test.com/apiname/?s=85465&ts=1370591808', 
 'http://test.com/apiname/?s=85465&ts=1370591808', 
 'http://test.com/apiname/?s=85465&ts=1370591808'
]
#list of urls

#the call back
def finish(results):
    for result in results:
    print 'GOT PAGE', len(result), 'bytes'
    reactor.stop()


waiting = [client.getPage(url) for url in urls]
defer.gatherResults(waiting).addCallback(finish)

reactor.run()
4

1 回答 1

1

鉴于提供的来源,第一个问题是 3 亿个 URL 字符串将占用大量 RAM。请记住,每个字符串都有超出字节的开销,并且将字符串组合到列表中可能需要重新分配。

此外,我认为这里的微妙错误是您试图将结果累积到等待 = [ ... ] 的列表中。我怀疑你的意思是你想要一个提供gatherResults() 的迭代器。

要解决这两个问题,请将您的文件写入“urls.txt”并尝试以下操作(也可以使用 urls = [...] 删除该位)

import sys.stdin
waiting = (client.getPage(url.strip() for url in sys.stdin)
defer.gatherResults(waiting).addCallback(finish)

reactor.run()

只需使用python script.py <urls.txt运行

[...] 和 (...) 之间的差异非常大。[...] 立即运行 ... 部分,创建一个巨大的结果列表;(...) 创建一个生成器,该生成器将为...中的每次迭代产生一个结果

注意:我没有机会测试任何一个(我不经常使用 Twisted),但从你发布的内容来看,这些更改应该有助于你的 RAM 问题

于 2013-06-27T19:13:32.810 回答