2016-10-14 11 views
0

のように見える竜巻ハンドラを考える:接続が閉じた場合on_connection_close()を実行すると、tornado.queues.Queue.get()コルーチンのブロックを解除できますか?

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

を使用してください。 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) 
関連する問題