Python:在继续代码流之前等待requests_futures.sessions完成

时间:2015-07-15 06:27:04

标签: python python-requests

我当前的代码打印出一个空列表,如何在继续代码流之前等待所有请求和回调完成?

from requests_futures.sessions import FuturesSession
from time import sleep

session = FuturesSession(max_workers=100)

i = 1884001540 - 100
list = []
def testas(session, resp):
    print(resp)
    resp = resp.json()
    print(resp['participants'][0]['stats']['kills'])
    list.append(resp['participants'][0]['stats']['kills'])
while i < 1884001540:
    url = "https://acs.leagueoflegends.com/v1/stats/game/NA1/" + str(i)
    temp = session.get(url, background_callback=testas)
    i += 1
print(list)

2 个答案:

答案 0 :(得分:2)

通过查看requests-futures-0.9.5.tar.gz中的session.py,必须创建一个未来,以便等待其结果如下所示:

from requests_futures import FuturesSession

session = FuturesSession()
# request is run in the background
future = session.get('http://httpbin.org/get')
# ... do other stuff ...
# wait for the request to complete, if it hasn't already
response = future.result()
print('response status: {0}'.format(response.status_code))
print(response.content)

如README.rst所示,可以而且应该为每个session.get()创建一个future,并等待完成。

这可能会在你的代码中应用,就像在while循环之前开始一样:

future = []
while i < 1884001540:
    url = "https://acs.leagueoflegends.com/v1/stats/game/NA1/" + str(i)
    future.append(session.get(url, background_callback=testas)
    i += 1
for f in future:
    response = f.result()
    # the following print statements may be useful for debugging
    # print('response status: {0}'.format(response.status_code))
    # print(response.content, "\n")
print(list)

我不确定你的系统将如何响应大量(1884001440)的期货而另一种方法是通过在较小的组中处理它们,例如每次100或1000。在开始时用相对较少的脚本测试脚本可能是明智的,以找出它们返回结果的速度。

答案 1 :(得分:-1)

从这里https://pypi.python.org/pypi/requests-futures它说

from requests_futures.sessions import FuturesSession

session = FuturesSession()
# first request is started in background
future_one = session.get('http://httpbin.org/get')
# second requests is started immediately
future_two = session.get('http://httpbin.org/get?foo=bar')
# wait for the first request to complete, if it hasn't already
response_one = future_one.result()

因此.result()似乎正在寻找