代码之家  ›  专栏  ›  技术社区  ›  Travis Griggs

取消阻止tornado.queues.Queue。当on_connection_close()时获取()协程?

  •  0
  • Travis Griggs  · 技术社区  · 8 年前

    假设龙卷风处理程序看起来像:

    class MyHandler(tornado.web.RequestHandler):
    
        @tornado.gen.coroutine
        def get(self):
            queue = self.getQueue() # returns a tornado.queues.Queue
            _ = yield queue.get()
            self.write("whatever")
    
        def on_connection_close(self):
            super().on_connection_close()
            # DO SOMETHING HERE THAT BREAKS OUT OF THE YIELD UP THERE??
    

    如果连接关闭,我真的不想在队列中保持阻塞状态,以便在以后错误地提取一个值。是否有一种机制可以设置为中止被阻止的 get() 方法

    1 回复  |  直到 8 年前
        1
  •  1
  •   kwarunek    8 年前

    使用 chain_future 链条 queue.get “未来”与您控制的其他未来(某种指示器/标志),然后只需在关闭时解析标志未来:

    from tornado.concurrent import Future, chain_future
    
    class MyHandler(tornado.web.RequestHandler):
    
        def initialize(self):
            # of course you can create that in get as well
            self.close_indicator = Future()
    
        @tornado.gen.coroutine
        def get(self):
            queue = self.getQueue() # returns a tornado.queues.Queue
            qget_future = queue.get()
            chain_future(self.close_indicator, qget_future) 
            _ = yield qget_future
            self.write("whatever")
    
        def on_connection_close(self):
            super().on_connection_close()
            # set close indicator by resolving future
            # result will be copied to chained future (qget_future)
            self.close_indicator.set_result(None)