2016-10-14 12 views
0

Учитывая обработчик торнадо, который выглядит как:Разблокировать tornado.queues.Queue.get() coroutine когда 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()?

ответ

1

Использование chain_future. Chain 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)