私は、トルネードを利用して Python で書かれたかなり大規模な http サーバーを開発しました。特別な設定をしなくても、サーバーはリクエストをブロックし、一度に 1 つのみしか処理できません。リクエストは基本的にデータ (mysql/redis) にアクセスし、json で出力します。これらのリクエストは、最悪の場合、1 秒以上かかることがあります。問題は、長い時間 (3 秒) を要する要求が入ってきて、その直後に簡単な要求が入ってきて、処理に 5 ミリ秒かかることです。最初のリクエストには 3 秒かかるため、最初のリクエストが完了するまで 2 番目のリクエストは開始されません。したがって、2 番目のリクエストの処理には 3 秒以上かかります。
どうすればこの状況を改善できますか? 他のリクエストに関係なく、実行を開始するには、2 番目の単純なリクエストが必要です。私は python が初めてで、apache/php の経験が豊富で、2 つの個別のリクエストが互いにブロックするという概念はありません。PHPの例をエミュレートするためにmod_pythonを調べましたが、それもブロックしているようです。tornado サーバーを変更して、必要な機能を取得できますか? どこを読んでも、tornado は複数の同時リクエストの処理に優れていると書かれています。
これが私が取り組んでいるデモコードです。並行性が機能するかどうかをテストするために使用しているスリープ コマンドがあります。スリープは並行性をテストする公正な方法ですか?
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.gen
import time
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def handlePing1(self):
time.sleep(4)#simulating an expensive mysql call
self.write("response to browser ....")
self.finish()
def get(self):
start = time.time()
self.handlePing1()
#response = yield gen.Task(handlePing1)#i see tutorials around that suggest using something like this ....
print "done with request ...", self.request.path, round((time.time()-start),3)
application = tornado.web.Application([
(r"/.*", MainHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
port=8833;
http_server.listen(port)
print "listening on "+str(port);
tornado.ioloop.IOLoop.instance().start()
助けてくれてありがとう!