4

所以我有一个帮助线程,它使用 https 监听来自服务器的信息。我正在使用 Python 的 Requests.Session 并在没有超时的情况下调用 get(),因为我们确实想等待一些响应。

但是,在关机时,我想很好地结束我所有的辅助线程。我不确定如何终止线程阻塞的 get 请求。在 *nix 环境中,关闭会话的底层套接字最终会引发异常。所以这是一种方法;关闭套接字,捕获异常,开心。在 Windows 上,这似乎不起作用。

杀死/结束会话和获取请求的正确方法是什么,以便我的帮助线程可以终止?

澄清:我正在使用 Python 的 Requests.Session.get()。

4

2 回答 2

8

在查看了我能想到的所有内容之后,看起来requests如果不一直到套接字级别就无法取消正在进行的请求。而且,正如 OP 所指出的那样,即使这在 Windows 上也没有直接帮助,除非你真正进入底层的选择或池循环,而不是仅仅关闭套接字。(如果你不关心 Windows,你可以更容易地通过signal线程来取消读取......)所以,这已经差不多了。

一种选择是杀死线程,或者让操作系统为你做这件事。如果线程也做其他工作……好吧,您总是可以将其拆分到不同的线程上。但这可能是对代码的重大且毫无根据的重写。

所以,听起来你需要放弃requests并使用其他东西。

cURL 库绝对有取消请求的能力。有一组名为 的官方绑定pycurl,但它的级别比 低得多requests,因此您可能需要查看通过搜索PyPI可以找到的 69105 更高级别的包装器。其中一些不是很完整/稳定/最新,所以你可能需要做一些尝试才能找到适合你的…</p>

于 2012-12-10T22:20:47.663 回答
-1

您可以使用 Python 请求的超时,文档说明您可以为超时参数设置一个元组,如 (conn_timeout_ms, read_timeout_ms):

r = requests.get('https://github.com', timeout=(conn_timeout_ms, read_timeout_ms))

在此示例中,如果在 read_timeout_ms 之后您没有从服务器获得任何响应,则请求将被中止

于 2020-03-18T13:45:38.177 回答