【问题标题】:Python: wait for requests_futures.sessions to finish before continuing with the code flowPython:等待 requests_futures.sessions 完成,然后再继续代码流
【发布时间】:2015-10-04 01:18:03
【问题描述】:

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

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)

【问题讨论】:

    标签: python python-requests


    【解决方案1】:

    从 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() 创建一个未来并等待完成。

    这可能会在您的代码中应用如下,在 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 个。明智的做法是在开始时使用相对较少的脚本来测试脚本,以了解它们返回结果的速度。

    【讨论】:

    • 你能用我的代码展示一下吗?我刚开始接触异步的东西,所以我很难理解这个。
    • 谢谢帮了我很多忙 :)
    • 在答案中添加了一些示例代码。不确定它将如何工作。最好从少量 session.gets 开始,因此 Futures 看看它们的响应速度。
    【解决方案2】:

    从这里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() 就是你要找的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2019-11-01
      • 2021-05-06
      • 2021-05-21
      相关资源
      最近更新 更多