【问题标题】:Specifying timeout for python-requests, when using PreparedRequest使用 PreparedRequest 时为 python 请求指定超时
【发布时间】:2015-07-05 19:28:16
【问题描述】:

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

但是我需要在发送之前设置超时。从本质上讲,对于 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 对象发送的所有请求设置超时?

谢谢。

【问题讨论】:

  • 什么是“sendit”?它是否接受它正在调用的函数/方法的任意关键字参数?

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


【解决方案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))
# ...

【讨论】:

  • 嗨!感谢回复。我已经更新了我的代码 sn-p。问题是,我正在尝试并行化从我的代码发出的请求。更新的代码是我如何做的更简单的版本。
  • @bad_keypoints 我已经用最好的方式更新了这个,可以做你想做的事。干杯
  • 谢谢。当我有时间回到那部分代码时,我会尝试一下,然后我会勾选你的答案。 :)
猜你喜欢
  • 2011-02-26
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2019-08-07
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多