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()
ため 'for'ループ何、それで?抽象的な例はあまりありませんか? – jonrsharpe
ループは何もありません。これは単なる例であり、関数に多くのものがある場合、結果はすべての関数が処理された後に送信されます。私はすぐに結果をすぐに送信したい。 –
'ThreadPool.apply_async()'が役に立ちます。 –