ホームページ バックエンド開発 Python チュートリアル Python でコルーチンと非同期 IO を使用して高性能ネットワーク サーバーを実装する方法

Python でコルーチンと非同期 IO を使用して高性能ネットワーク サーバーを実装する方法

Oct 27, 2023 pm 06:36 PM
コルーチン ハイパフォーマンス 非同期

Python でコルーチンと非同期 IO を使用して高性能ネットワーク サーバーを実装する方法

Python でコルーチンと非同期 IO を使用して高性能ネットワーク サーバーを実装する方法

はじめに:
インターネットの発展に伴い、サーバーのパフォーマンスは低下しました。ネットワーク サーバーの要件はますます高くなっています。従来の同期 IO 方法では、多くの場合、高い同時実行要件を満たすことができず、サーバーの応答が遅くなります。コルーチンと非同期 IO を使用すると、サーバーの同時実行パフォーマンスが大幅に向上します。この記事では、Python でコルーチンと非同期 IO を使用して高性能ネットワーク サーバーを実装する方法を紹介します。

1. コルーチンと非同期 IO の概要
1.1 コルーチン
コルーチンは、オペレーティング システムによるスケジューリングを必要とせず、開発者自身によってスケジュールされる軽量のスレッドです。コルーチンの特徴は、単一のスレッドで複数のタスクの同時実行を実装でき、スレッド切り替えのオーバーヘッドを回避できることです。

1.2 非同期 IO (非同期 IO)
非同期 IO とは、IO 操作の進行中に、CPU が IO 操作の完了を待たずに他のタスクを同時に実行できることを意味します。これにより、CPU 使用率が大幅に向上します。

2. コルーチンと非同期 IO を使用してネットワーク サーバーを実装する
2.1 サーバー フレームワークを構築する
最初に、基本的なネットワーク サーバー フレームワークを構築する必要があります。非同期 IO フレームワークは、Python の標準ライブラリで提供される asyncio モジュールを使用して簡単に実装できます。以下は簡単な例です:

import asyncio

async def handle_request(reader, writer):
    data = await reader.read(1024)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    print(f"Received {message} from {addr}")

    writer.close()

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())
ログイン後にコピー

上記のコードは、クライアント要求を受信して​​コンソールに出力する単純なネットワーク サーバーを実装しています。ネットワーク サーバーは、asyncio.start_server 関数を通じて起動し、server.serve_forever() を通じて実行し続けることができます。

2.2 コルーチンを使用してリクエストを処理する
ネットワーク サーバーでは、コルーチンを使用してクライアントのリクエストを処理できます。たとえば、コルーチンの特性を利用して、ネットワーク リクエストとデータベース操作やファイルの読み書きなどの非同期操作を組み合わせることができます。

import asyncio

async def handle_request(reader, writer):
    data = await reader.read(1024)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    # 处理请求的逻辑
    response = await process_request(message)

    # 发送响应
    writer.write(response.encode())
    await writer.drain()

    writer.close()

async def process_request(message):
    # 处理请求的逻辑,比如数据库查询、文件读写等
    await asyncio.sleep(1) # 模拟耗时操作
    return "Hello, " + message

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())
ログイン後にコピー
ログイン後にコピー

上記のコードでは、handle_request 関数の process_request コルーチンを呼び出してリクエストを処理します。データベース クエリ、ファイルの読み取りと書き込みなど、時間のかかる一部の操作は process_request で完了できます。このようにして、サーバーは複数のリクエストを同時に処理し、クライアントにタイムリーに応答できます。

2.3 同時プログラミングを使用して複数の接続を処理する
同時実行性が高い場合、サーバーが同時に複数のリクエストを処理して同時処理能力を向上できることが望まれます。この目的のために、Python の asyncio が提供する gather 関数を使用して同時プログラミングを実装できます。

import asyncio

async def handle_request(reader, writer):
    data = await reader.read(1024)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    # 处理请求的逻辑
    response = await process_request(message)

    # 发送响应
    writer.write(response.encode())
    await writer.drain()

    writer.close()

async def process_request(message):
    # 处理请求的逻辑,比如数据库查询、文件读写等
    await asyncio.sleep(1) # 模拟耗时操作
    return "Hello, " + message

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    async with server:
        await server.serve_forever()

asyncio.run(main())
ログイン後にコピー
ログイン後にコピー

main 関数では、gather 関数を使用して複数のリクエストを同時に処理できます。

async def main():
    server = await asyncio.start_server(
        handle_request, 'localhost', 8888)

    addr = server.sockets[0].getsockname()
    print(f"Serving on {addr}")

    await asyncio.gather(
        server.serve_forever(),
        some_other_task(),
        another_task()
    )
ログイン後にコピー

このようにして、サーバー複数のリクエストを同時に処理できるため、同時実行パフォーマンスが大幅に向上します。

結論:
この記事では、Python でコルーチンと非同期 IO を使用して高性能ネットワーク サーバーを実装する方法を紹介します。コルーチンを使用してリクエストを処理し、複数の接続を同時に処理することにより、サーバーの処理能力を大幅に向上させることができます。非同期 IO により、サーバーは IO 操作の実行時にメインスレッドをブロックすることなく CPU リソースを最大限に活用できます。この方法は、同時実行性が高い状況に適しており、スケーラビリティとパフォーマンスに優れています。

参考文献:

  1. https://docs.python.org/3/library/asyncio.html
  2. https://www.geekxh.com / 0.10.基礎知識/005.html

以上がPython でコルーチンと非同期 IO を使用して高性能ネットワーク サーバーを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

golang 関数と goroutine の親子関係 golang 関数と goroutine の親子関係 Apr 25, 2024 pm 12:57 PM

Go では関数とゴルーチンの間に親子関係があり、親ゴルーチンは子ゴルーチンを作成し、子ゴルーチンは親ゴルーチンの変数にアクセスできますが、その逆はできません。 go キーワードを使用して子ゴルーチンを作成すると、子ゴルーチンは匿名関数または名前付き関数を通じて実行されます。親ゴルーチンは、すべての子ゴルーチンが完了する前にプログラムが終了しないように、sync.WaitGroup を介して子ゴルーチンが完了するのを待つことができます。

Golang API 設計における同時実行性とコルーチンの適用 Golang API 設計における同時実行性とコルーチンの適用 May 07, 2024 pm 06:51 PM

同時実行性とコルーチンは、GoAPI 設計で次の目的で使用されます。 高パフォーマンス処理: 複数のリクエストを同時に処理してパフォーマンスを向上させます。非同期処理: コルーチンを使用してタスク (電子メールの送信など) を非同期に処理し、メインスレッドを解放します。ストリーム処理: コルーチンを使用して、データ ストリーム (データベース読み取りなど) を効率的に処理します。

Golang コルーチンのライフサイクルを制御するにはどうすればよいですか? Golang コルーチンのライフサイクルを制御するにはどうすればよいですか? May 31, 2024 pm 06:05 PM

Go コルーチンのライフ サイクルは、次の方法で制御できます。 コルーチンを作成します。 go キーワードを使用して、新しいタスクを開始します。コルーチンを終了する: すべてのコルーチンが完了するまで待ち、sync.WaitGroup を使用します。チャネル終了信号を使用します。コンテキスト context.Context を使用します。

Golang 非同期 IO の基盤となる実装テクノロジーを解読する Golang 非同期 IO の基盤となる実装テクノロジーを解読する Mar 18, 2024 pm 12:00 PM

Golang は強力で柔軟なプログラミング言語として、非同期 IO の独自の設計と実装を備えています。この記事では、Golang 非同期 IO の基盤となる実装テクノロジを深く分析し、そのメカニズムと原理を調査し、デモンストレーション用の具体的なコード例を提供します。 1. 非同期 IO の概要 従来の同期 IO モデルでは、読み取りと書き込みが完了して結果が返されるまで、IO 操作はプログラムの実行をブロックします。対照的に、非同期 IO モデルでは、プログラムは IO 操作が完了するまで待機できます。

Python asyncio の上級ガイド: 初心者から専門家まで Python asyncio の上級ガイド: 初心者から専門家まで Mar 04, 2024 am 09:43 AM

同時プログラミングと非同期プログラミング 同時プログラミングは、同時に実行される複数のタスクを扱います。非同期プログラミングは、タスクがスレッドをブロックしない同時プログラミングの一種です。 asyncio は Python の非同期プログラミング用のライブラリで、プログラムがメイン スレッドをブロックせずに I/O 操作を実行できるようにします。イベント ループ asyncio の中核は、I/O イベントを監視し、対応するタスクをスケジュールするイベント ループです。コルーチンの準備が完了すると、イベント ループは I/O 操作を待つまでそのコルーチンを実行します。その後、コルーチンを一時停止し、他のコルーチンの実行を継続します。コルーチン コルーチンは、実行を一時停止および再開できる関数です。 asyncdef キーワードは、コルーチンの作成に使用されます。コルーチンは await キーワードを使用して、I/O 操作が完了するのを待ちます。 asyncio の次の基本

Golang コルーチンとゴルーチンの関係 Golang コルーチンとゴルーチンの関係 Apr 15, 2024 am 10:42 AM

コルーチンはタスクを同時に実行するための抽象的な概念であり、ゴルーチンはコルーチンの概念を実装する Go 言語の軽量スレッド関数です。この 2 つは密接に関連していますが、Goroutine のリソース消費量は少なく、Go スケジューラによって管理されます。 GoroutineはWebリクエストの同時処理やプログラムのパフォーマンス向上など、実戦で広く活用されています。

Python 非同期プログラミング: 非同期コードで効率的な同時実行性を実現する方法 Python 非同期プログラミング: 非同期コードで効率的な同時実行性を実現する方法 Feb 26, 2024 am 10:00 AM

1. 非同期プログラミングを使用する理由は何ですか?従来のプログラミングではブロッキング I/O が使用されます。つまり、プログラムは操作が完了するまで待機してから続行します。これは単一のタスクではうまく機能する可能性がありますが、多数のタスクを処理する場合にはプログラムの速度が低下する可能性があります。非同期プログラミングは、従来のブロッキング I/O の制限を破り、非ブロッキング I/O を使用します。つまり、プログラムは、タスクの完了を待たずに、タスクを別のスレッドまたはイベント ループに分散して実行できます。これにより、プログラムは複数のタスクを同時に処理できるようになり、プログラムのパフォーマンスと効率が向上します。 2. Python 非同期プログラミングの基礎 Python 非同期プログラミングの基礎は、コルーチンとイベント ループです。コルーチンは、関数の一時停止と再開を切り替えることができる関数です。イベントループはスケジュールを担当します

高性能 Python プログラミング ワークステーションを構築するためのコンピューター構成の推奨事項 高性能 Python プログラミング ワークステーションを構築するためのコンピューター構成の推奨事項 Mar 25, 2024 pm 07:12 PM

タイトル: 高性能 Python プログラミング ワークステーションを構築するためのコンピューター構成の推奨事項 データ分析、人工知能、その他の分野で Python 言語が広く応用されるにつれ、ますます多くの開発者や研究者が高性能 Python プログラミングを構築する需要を高めています。ワークステーション。コンピューター構成を選択するときは、パフォーマンスの考慮に加えて、プログラミングの効率と実行速度を向上させるために、Python プログラミングの特性に応じて最適化する必要もあります。この記事では、高性能 Python プログラミング ワークステーションを構築し、具体的な機能を提供する方法を紹介します。

See all articles