中止长时间运行的http操作

时间:2014-07-03 07:43:18

标签: python multithreading sockets couchdb

在我的(python)代码中,我有一个线程正在侦听来自couchdb feed(continuous changes)的更改。更改请求的timeout parameter在某些情况下太大(例如,当用户想要使用^C手动中断程序时)。

  • 如何中止长时间阻止的http请求?
  • 这可能,或者我是否需要减少超时以使我的程序更具响应性?

这是不幸的,因为超时足够小以使程序真正响应(比如说1s),意味着创建了很多连接(每秒一个!),这违背了收听更改的目的,并且很难确保我们没有遗漏任何更改(在重新连接时间内,我们确实可以错过更改,因此需要特殊代码来处理该情况)

另一种选择是强制中止线程,但是that is not really an option in python

2 个答案:

答案 0 :(得分:2)

如果我理解正确,在决定是否响应用户之前,您似乎在请求之间等待太长时间。你是对的,不断关闭,创建新的连接会破坏改变饲料的目的。

解决方案可能是使用heartbeat查询参数,其中couchdb将继续发送换行符以告知客户端连接仍然存在。

http://localhost:5984/hello/_changes?feed=continuous&heartbeat=1000&include_docs=true

只要您获得心跳(换行符),就可以确定您正在获得新的更改。新行将指示未发生任何更改。将报告实际变更的情况。无需关闭连接。回复您的客户if resp!="/n"

答案 1 :(得分:1)

阻止线程执行通常会阻止线程终止。您需要等到请求超时。但这已经很清楚了。 使用支持非阻塞请求的库可能是一种解决方案,但我不知道是否有任何问题。 无论如何......你已经提到减少超时会导致更多连接。我建议在可以被外部信号中断以终止线程的请求之间实现等待循环。使用此循环,您可以控制独立于超时的请求数。