on_connection_close() 时取消阻塞 tornado.queues.Queue.get() 协程?

Unblock tornado.queues.Queue.get() coroutine when on_connection_close()?

给定一个看起来像这样的龙卷风处理器:

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() 方法吗?

使用chain_future。将 queue.get 的未来与您控制的其他未来(某种 indicator/flag)链接起来,然后在关闭时简单地解析标志未来:

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)