如何取消正在进行的Requests.Session.Get请求?

时间:2012-12-10 21:11:50

标签: python sockets python-requests

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

然而,在关机时,我想很好地结束我所有的帮助线程。我不知道如何杀死线程阻塞的get请求。在* nix环境中关闭会话的底层套接字将最终抛出异常。这是一种方法来做到这一点;关闭套接字,捕捉异常,快乐。在Windows上,这似乎不起作用。

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

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

2 个答案:

答案 0 :(得分:6)

在查看了我能想到的所有内容后,看起来requests无法取消正在进行的请求而无法一直到套接字级别。并且,正如OP所指出的那样,即使这对Windows没有直接帮助,除非您实际进入底层的select-or-pool循环而不是仅关闭套接字。 (如果你不关心Windows,你可以更容易地通过signal线程来取消读取...)所以,这几乎是出来的。

一种替代方法是杀死线程,或让操作系统为您完成。如果线程也做了其他工作......好吧,你可以总是把它分成不同的线程。但这可能是对代码进行重大而无根据的重写。

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

cURL库绝对可以取消请求。有一组称为pycurl的官方绑定,但它比requests低得多,因此您可能希望通过搜索PyPI来查看可以找到的69105更高级别的包装器。 。其中一些不是非常完整/稳定/最新,所以你可能需要做一些游戏,为你找到合适的...

答案 1 :(得分:0)

您可以使用python请求超时,the documentation解释说您可以设置一个 像元组(conn_timeout_ms,read_timeout_ms)作为超时参数:

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

在此示例中,如果在read_timeout_ms之后没有收到服务器的任何响应,则请求将被中止