龙卷风处理者有没有办法探测到另一端的关闭?

2024-09-22 16:39:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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()可以有一个超时,但我真正想要的不是超时,而是一种“除非我关闭”异常。你知道吗


Tags: self处理程序客户端get队列with情况network
1条回答
网友
1楼 · 发布于 2024-09-22 16:39:09

您需要一个“保证传递的队列”,这在分布式系统中是一个困难的问题。毕竟,即使自我书写“成功了,你不能确定对方是否真的收到了消息。你知道吗

基本方法如下所示:

  • 队列中的每个条目都会获得一个大于所有先前id的id
  • 当客户端连接时,它要求订阅队列
  • 当客户机断开连接时,它将重新连接并请求id大于它看到的最后一个id的所有条目
  • 当您的QueryHandler接收到具有非getid的None时,它首先服务于id大于id的所有条目,然后开始等待队列
  • 当QueryHandler从self.write引发异常时,忽略它:客户机负责检索丢失的条目
  • 在列表中保留所有过去的条目
  • 在一段时间(小时)后过期最旧的列表条目你知道吗

相关问题 更多 >