server.py を実行して、ローカル マシンで Tornado プロジェクトに取り組んできました。サーバー (Heroku など) にデプロイされた場合、server.py の単一のインスタンスがすべてのクライアントで共有されますか?それとも、各クライアントは独自の実行バージョンを持ちますか? server.py でグローバル変数を使用することを考えており、それらがすべてのクライアントまたは単一のクライアントで共有されるかどうか疑問に思っているため、これについて疑問に思っています。
3 に答える
Tornado を使用すると、マシン/VM ごとに少なくとも 1 つのプロセスが存在します (Heroku ではこれらを「dyno」と呼びます)。マルチコア環境では、マシンごとに複数のプロセス (コアごとに 1 つ) を実行する必要があります。各プロセスは多くのユーザーを処理するため、プロセスが 1 つしかない単純なケースでは、グローバル変数を使用してユーザー間で状態を共有できますが、複数の dyno とプロセスに成長すると、何らかのプロセス間通信が必要になります。
実行フローは、ローカル マシンで実行する場合と同じである必要があります。次のコードを取ります:-
import tornado.ioloop
import tornado.web
print 'This is executed only once and global'
name = 'myname'
class MainHandler(tornado.web.RequestHandler):
print 'This is executed only once'
def get(self):
print 'This is executed for each requests'
self.write("Hello, world %s " % name)
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
いつ、次の出力が得られます:-
$ ./bin/python server.py
This is executed only once and global
This is executed only once
This is executed for each requests
WARNING:tornado.access:404 GET /favicon.ico (::1) 0.52ms
This is executed for each requests
WARNING:tornado.access:404 GET /favicon.ico (::1) 0.25ms
これは、サーバーが起動するたびにクラス本体の外側のコードが実行され、再起動されるまで状態が維持されることを意味します。サーバーが起動されると、クラスもインスタンス化さMainHandler
れ、受信リクエストごとget
にインスタンスのメソッドが呼び出されます。これは、クラス本体のコードも 1 回実行され、メソッド内のコードのみがget
着信要求ごとに新しい状態になることを意味します。あなたの質問の「クライアント」は、着信する Web リクエストを意味すると思います。
通常、通常の python wsgi アプリケーションでは、パラメーターを明示的にチェーンに渡さずに関数間で共有状態を維持する方法は、スレッド ローカル オブジェクトを使用することです。私はトルネードについてあまり知りませんが、簡単に読んだところ、スレッド内で実行されないように見えるため、ドキュメントを参照して、関数間で状態を共有するための推奨される方法を見つける必要があります。