我正在尝试修改此处显示的解决方案:Python中发送100,000个HTTP请求的最快方法是什么?,不同的是我正在进行一个API请求,该请求返回一个字典,并且我希望所有这些API请求的最终结果是所有字典的列表。
像链接的示例一样,当前每行将成功打印url和结果。相反,我想在每个线程中将(url, result)添加到列表中,然后在最后将它们连接成一个主列表。我无法弄清楚如何拥有这个主列表并在最后加入结果。有人可以帮助我修改doSomethingWithResult吗?如果我正在执行一个大循环,我将只有一个空列表,并且在每个API请求之后将结果附加到列表中,但是现在我不知道如何模仿这个。我预计一个常见的回答将是使用异步I/O,如果这是建议,那么我希望有人提供实际完成与上面链接代码同样多的示例。
这是我的代码--请考虑api_calls是一个包含每个要打开的URL以获取JSON请求的列表...
from threading import Thread
from Queue import Queue
concurrent = 200
def doWork():
while True:
url = q.get()
result = makeRequest(url[0])
doSomethingWithResult(result, url)
q.task_done()
def makeRequest(ourl):
try:
api_call = urlopen(ourl).read()
result = json.loads(api_call)
return result, ourl
except:
return "error", ourl
def doSomethingWithResult(result, url):
print(url,result)
q = Queue(concurrent * 2)
for i in range(concurrent):
t = Thread(target=doWork)
t.daemon = True
t.start()
try:
for url in api_calls:
q.put(url)
q.join()
except KeyboardInterrupt:
sys.exit(1)
像链接的示例一样,当前每行将成功打印url和结果。相反,我想在每个线程中将(url, result)添加到列表中,然后在最后将它们连接成一个主列表。我无法弄清楚如何拥有这个主列表并在最后加入结果。有人可以帮助我修改doSomethingWithResult吗?如果我正在执行一个大循环,我将只有一个空列表,并且在每个API请求之后将结果附加到列表中,但是现在我不知道如何模仿这个。我预计一个常见的回答将是使用异步I/O,如果这是建议,那么我希望有人提供实际完成与上面链接代码同样多的示例。