我知道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
对象发送的所有请求设置超时?
谢谢。
答案 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))
# ...