2016-07-04 7 views
1

api呼び出しに基づいてブラウザに結果を送信する次のコードがあります。竜巻で直ちにGET応答を送信するには?

import tornado.ioloop 
import tornado.web 
from tornado import gen 
from datetime import date 



class GetGameByIdHandler(tornado.web.RequestHandler): 
    @gen.coroutine 
    def get(self, id): 
     response = { 'id': int(id), 
        'name': 'Crazy Game', 
        'release_date': date.today().isoformat() } 
     self.set_header('Content-Type', 'text/json') 
     self.write(response) 


     for i in range(10000000): 
      for j in range(10): 
       pass 
     print i 


application = tornado.web.Application([ 
    (r"/getgamebyid/([0-9]+)", GetGameByIdHandler), 
], debug = True) 



if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

私は、APIとすぐself.writeが検出されたとして、結果を返す必要があることを望みます。その後、forループを実行する必要があります。これをどうすればいいのですか?基本的には、すぐに結果を返すことはしません。

注:このループは、get機能のこの余分なもののためだけに結果の送信が遅れていることを示す以外は本物の目的を持っていません。

抽象度の低い例:

import tornado.ioloop 
import tornado.web 
from tornado import gen 
from datetime import date 



class GetGameByIdHandler(tornado.web.RequestHandler): 
    @gen.coroutine 
    def get(self, id): 
     result_dict = GetResultsFromDB(id) 
     response = result_dict 
     self.set_header('Content-Type', 'text/json') 
     self.write(response) 

     # Basically i want to doSomething basedon results 
     # Generated from DB 
     for key in result_dict: 
      if result_dict[key] == None: 
       DoSomething() 


application = tornado.web.Application([ 
    (r"/getgamebyid/([0-9]+)", GetGameByIdHandler), 
], debug = True) 



if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 
+0

ため 'for'ループ何、それで?抽象的な例はあまりありませんか? – jonrsharpe

+0

ループは何もありません。これは単なる例であり、関数に多くのものがある場合、結果はすべての関数が処理された後に送信されます。私はすぐに結果をすぐに送信したい。 –

+0

'ThreadPool.apply_async()'が役に立ちます。 –

答えて

1

あなたがソケットにすべてのデータを書き込んだ後、いくつかのコードを実行する必要がある場合、あなたはtornado.web.RequestHandler.flushを使用することができます。

self.write(response) 
    self.flush(callback=lambda: DoSomethingWrapper(response)) 
+0

これは正常に動作します。しかし、 'DoSomething'が続いている場合、別のhttp取得要求は前の要求を待つことになります。それを避ける方法は? –

+1

hm、[python Tornadoサーバーでのリクエスト内のマルチプロセッシングを最適に実行するにはどうすればいいですか?](http://stackoverflow.com/questions/15375336/how-to-best-perform-multiprocessing-within-requests-with -the-python-tornado-serv)などのトピック – Aprillion

関連する問題