ホームページ  >  記事  >  バックエンド開発  >  Python での Web 開発: トルネードの動作

Python での Web 開発: トルネードの動作

PHPz
PHPzオリジナル
2023-06-11 10:49:441434ブラウズ

インターネットの台頭により、IT 分野における Web 開発の重要性がますます高まっています。 Pythonは開発効率を重視した高級プログラミング言語としてWeb開発の分野でも人気が高まっています。その中でも、軽量ネットワーク フレームワークである Tornado は、Python で独自の位置を占めており、非同期 IO ベースのメソッドを使用するため、従来の同期 IO メソッドよりも高速に同時リクエストを処理できます。この記事ではPythonでのWeb開発にTornadoを使う方法やテクニックを実戦を通して紹介していきます。

1. Tornado のインストールと基本的な使い方

まず、Tornado をローカル環境にインストールする必要があります。 pip 経由でインストールできます:

pip install tornado

インストールが完了したら、Tornado を使用して簡単な Web サーバーを構築できます。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

上記のコードでは、tornado.web.RequestHandler から継承した MainHandler クラスを定義し、クライアントから送信された GET リクエストを処理できます。コンストラクターでは、self.write() メソッドを使用してクライアントにメッセージを返します。次に、tornado.web.Application オブジェクトを作成する make_app() 関数を定義します。このオブジェクトのコンストラクターでは、定義した MainHandler クラスにルートをマップし、それを返します。最後に、if name == "__main__" コード ブロックで Application オブジェクトを作成し、ローカル 8888 ポートでリッスンし、IOLoop ループを開始します。ローカル ブラウザで http://localhost:8888 にアクセスすると、「Hello, world」というメッセージが表示されます。

2. Tornado の非同期 IO

Tornado の非同期 IO ベースのメカニズムは、効率的な Web フレームワークとして、クライアントのリクエストに迅速に応答することを可能にします。従来の同期 IO 操作では、各リクエストは次のリクエストに進む前に、前のリクエストの完了を待つ必要があります。非同期 IO 操作では、IO 操作が開始されると、スレッドは永久にブロックされず、すぐに戻り、次のリクエストの実行を継続します。このメカニズムにより、Web サーバーは複数のリクエストを同時に処理できるようになり、システムの同時処理能力が向上します。

まず、同期 IO の例を見てみましょう。

import tornado.ioloop
import tornado.web
import time

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        time.sleep(5)
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

上記のコードでは、完了までに 5 秒かかる操作をシミュレートします。ブラウザでサーバーにアクセスすると、リクエストが処理されるまで待機することになります。

次に、非同期 IO 操作の使用例を見てみましょう。

import tornado.ioloop
import tornado.gen
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    @tornado.gen.coroutine
    def get(self):
        yield tornado.gen.sleep(5)
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

上記のコードでは、tornado.gen.coroutine 修飾子を使用し、yield ステートメントを使用して非同期 IO 操作を実装しています。これは、yield ステートメントを実行する前に、プロセッサがすぐに戻って次のリクエストを処理し、非同期操作が完了するまで結果はクライアントに返されないことを意味します。

3. Tornado のマルチスレッドとマルチプロセス

Tornado は、非同期 IO 機能に加えて、マルチスレッドまたはマルチプロセスを通じてサーバーの同時処理能力を向上させることもできます。テクノロジー。 Tornado では、マルチスレッドまたはマルチプロセス処理を実装するために 2 つのメソッドを使用できます:

1. tornado.process.fork_processes() を使用してマルチプロセス モードを有効にします。このメソッドは、マルチプロセス モードを自動的に設定します。 CPU コアの数に基づくプロセス モード 各プロセスには、対応するポートが割り当てられます。

import tornado.ioloop
import tornado.web
import tornado.process

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.process.fork_processes()
    tornado.ioloop.IOLoop.current().start()

上記のコードでは、tornado.process.fork_processes() メソッドを使用してマルチプロセス モードを有効にし、CPU 並列処理の利点を最大限に活用できるようにしています。

2. tornado.concurrent.futures.ThreadPoolExecutor() を使用してマルチスレッド モードを有効にします。

import tornado.ioloop
import tornado.web
import tornado.concurrent
import concurrent.futures

class MainHandler(tornado.web.RequestHandler):
    executor = concurrent.futures.ThreadPoolExecutor()

    @tornado.concurrent.run_on_executor
    def my_background_task(self):
        # 执行一些耗时的IO操作
        return result

    @tornado.gen.coroutine
    def get(self):
        result = yield self.my_background_task()
        self.write(result)

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

上記のコードでは、tornado.concurrent.futures.ThreadPoolExecutor() を使用してマルチスレッド モードを有効にし、@tornado.concurrent.run_on_executor 修飾子を使用して my_background_task() メソッドを実行するスレッド プール。このようにして、単一のスレッドで複数の IO 操作を同時に処理できます。

4. 概要

この記事では、Tornado の基本的な使用法、非同期 IO 操作、マルチスレッドおよびマルチプロセス テクノロジを紹介することで、読者が Python での Tornado for Web の使用法を理解できるようにします。開発方法やテクニック、活用例など。 Tornado の効率性、シンプルさ、柔軟性により、Python での Web 開発にとって重要なツールの 1 つとなっています。 Tornado はすべての Web シナリオに適しているわけではありませんが、高いパフォーマンスと同時実行要件が必要な一部のシナリオでは、Tornado が優れたパフォーマンスを示します。

以上がPython での Web 開発: トルネードの動作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。