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)
给定一个看起来像这样的龙卷风处理器:
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)