使用PreparedRequest时指定python请求的超时

时间:2015-04-27 11:11:54

标签: python-3.x python-requests concurrent.futures

我知道PreparedRequest,我们在session.send调用中指定了超时,其中session可以是requests.Session类的实例,正如我在此处已经看到的那样:{{3 }}

但是我需要在发送之前设置超时。对PreparedRequest对象有些内在。因为我使用session.send方法作为map函数,所以要映射到PreparedRequest实例。

def async_req2resp(reqs, session):
    responses = []
    try:
        with futures.ThreadPoolExecutor(max_workers=workers) as executor:
            for response in executor.map(session.send, requests):
                responses.append(response)
    except Exception as e:
        print('async_requests2responses exception: ' + str(e))
    return responses

现在我需要以某种方式指定超时。我该怎么做? 上面的代码包含在一个方法中。我将session对象作为参数。有没有办法在session.send并行执行之前为session对象发送的所有请求设置超时?

谢谢。

1 个答案:

答案 0 :(得分:0)

我正在等待您对sendit的回答,但在此之前,请允许我向您提供一些信息,以帮助您完成剩下的工作。

如果你有一个PreparedRequest对象为request,那么你可以session.send(request, timeout=timeout_val) timeout_val,无论你想要的超时值是什么。

考虑到这一点,这个问题就变成了,“我如何在每次请求时将其传递给sendit?”那个问题我没有答案。

旁注:

您已使用concurrent.futures对此进行了标记,这使我怀疑您正在尝试优化使用此方法的应用程序。考虑到这一点,您应该避免不惜一切代价附加到列表中。相反,您应该尝试执行以下操作:

responses = []
try:
    responses = list(sendit.map(session.send, requests))
# etc.

如果您弄清楚如何将timeout参数传递给sendit,请随时建议编辑此答案以将其更新为完整。

通过问题中的更新信息,我可以更准确地回答您的问题。

在致电executor.map之前,您应该执行以下操作:

import functools

timedout_send = functools.partial(session.send, timeout=my_timeout)

try:
    list(executor.map(timedout_send, requests))
# ...