2016-09-02 14 views
1

私はthis questionの亜種を実装するために、竜巻先物を使用しています。過去のデータを蓄積したくないので、キューに問題があります。私は、1つのHTTPリクエストハンドラが、オリジナルが開始した後に発生する別のものの結果を待つのをブロックするようにしたい。tornado.concurrent.Future例外で混乱しています

しかし、私は一歩足りないと思う。何が起こることは、私がどのように見えるエラーが出るということです

Events = dict() 

class EventHandler(tornado.web.RequestHandler): 
    @tornado.gen.coroutine 
    def get(self, unit): 
     # create future to block on 
     future = tornado.concurrent.Future() 
     # store the future at a place the produce can find it 
     Events[unit] = future 
     # block waiting for the future's response 
     result = yield future.result() 
     # deregister the future 
     Events.pop(unit, None) 
     self.write(result) 

    @tornado.gen.coroutine 
    def post(self, unit): 
     # fetch the corresponding future if there is one 
     future = Events.get(unit, None) 
     if future: 
      # found one, set the result to pass body over 
      future.set_result(self.request.body) 
     else: 
      print('noop') 
     self.write(bytes()) 

私のコードは次のようになります

File "./foo.py", line 44, in get 
    result = yield future.result() 
    File "/usr/lib/python3/dist-packages/tornado/concurrent.py", line 216, in result 
    self._check_done() 
    File "/usr/lib/python3/dist-packages/tornado/concurrent.py", line 294, in _check_done 
    raise Exception("DummyFuture does not support blocking for results") 

私が正しく未来を使用していませんか?それを構成する際に追加のステップが必要ですか?その_check_doneの動作を実装するサブクラスを作るはずですか? Futureは、他のシステムと同義であったと私は仮定していますか?promiseは間違っていますか?未来/約束を使う以外にもこれを行うための別の方法がありますか?あなたは

result = yield future 

ない

result = yield future.result() 

yield future.result()を使用する必要が

答えて

2

yield <whatever is returned by future.result()>に実際に等価です。結果がまだ準備できていない場合は、result() APIが結果が準備完了になるまでブロックする(つまり、竜巻イベントループをブロックする)ことを意味し、tornado.concurrent.Futureはそれをサポートしていません。ノンブロッキングyield future構成を使用して結果を待つことができます。

関連する問題