我有一个tornado coroutine hander,看起来有点像:
class QueryHandler(tornado.web.RequestHandler):
queryQueues = defaultdict(tornado.queues.Queue)
@tornado.gen.coroutine
def get(self, network):
qq = self.queryQueues[network]
query = yield qq.get()
# do some work with with the dequeued query
self.write(response)
在客户端,我使用python-requests
长轮询它:
fetched = session.get(QueryURL)
我可以做一个查询,服务器阻塞等待队列,直到抛出一个要处理的东西并最终响应。你知道吗
这工作相当顺利,直到。。。当处理程序阻塞队列时,长轮询将关闭并重新启动。当我在客户端停止查询时,处理程序保持阻塞状态。更糟糕的是,如果我在客户端重新启动查询,我现在有第二个处理程序实例阻塞了队列。因此,当队列中确实显示了数据时,过时的处理程序将对其进行处理并回复bitbucket,此时重新启动的查询将被无限期地阻止。你知道吗
有什么模式可以避免这种情况吗?我曾希望,当客户端关闭时,处理程序将收到某种异常,表明情况已经恶化。这个队列.get()可以有一个超时,但我真正想要的不是超时,而是一种“除非我关闭”异常。你知道吗
您需要一个“保证传递的队列”,这在分布式系统中是一个困难的问题。毕竟,即使自我书写“成功了,你不能确定对方是否真的收到了消息。你知道吗
基本方法如下所示:
get
id的None
时,它首先服务于id大于id的所有条目,然后开始等待队列self.write
引发异常时,忽略它:客户机负责检索丢失的条目相关问题 更多 >
编程相关推荐