1

我知道对于 PreparedRequest,我们在session.send调用中指定超时,其中session可以是requests.Session类的实例,正如我已经在这里看到的那样:http: //docs.python-requests.org/en/latest/user/advanced/

但是我需要在发送之前设置超时。从本质上讲,对于 PreparedRequest 对象。因为我使用该session.send方法作为映射函数,映射到 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在 session.send 的并行执行发生之前,有没有办法可以为将与对象一起发送的所有请求设置超时?

谢谢你。

4

1 回答 1

1

我正在等待你的回答,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))
# ...
于 2015-04-27T18:29:32.077 回答