ホームページ  >  記事  >  バックエンド開発  >  Python の非同期ノンブロッキング ストリームの使用方法

Python の非同期ノンブロッキング ストリームの使用方法

王林
王林転載
2023-05-21 22:02:081330ブラウズ

1. 非同期ストリーム

asyncio の主な利点の 1 つは、ノンブロッキング ストリームを使用できることです。

Asyncio は、ノンブロッキング I/O ソケット プログラミングを提供します。ストリーミングで提供されます。

ストリーム ライターおよびストリーム ライターへのアクセスを提供するソケットを開くことができます。コルーチンを使用してストリームへのデータの書き込みと読み取りを行い、必要に応じて一時停止します。完了したら、ソケットを閉じることができます。

非同期ストリーミング機能は低レベルであるため、必要なプロトコルはすべて手動で実装する必要があります。

これには、次のような一般的な Web プロトコルが含まれる場合があります。

  • Web サーバーと対話するための HTTP または HTTPS

  • SMTP電子メール サーバーとの対話

  • ファイル サーバーと対話するための FTP。

これらのストリームは、標準プロトコルを使用してリクエストを処理するサーバーを作成したり、独自のアプリケーション固有のプロトコルを開発したりするために使用することもできます。

非同期ストリームとは何かを理解したので、その使用方法を見てみましょう。

2. 接続を開く方法

asyncio.open_connection() 関数を使用して、asyncio TCP クライアント ソケット接続を開くことができます。

これは、ソケット接続が開いたら待機して戻る必要があるコルーチンです。

この関数は、ソケットとの対話に使用される StreamReader オブジェクトと StreamWriter オブジェクトを返します。

...
# open a connection
reader, writer = await asyncio.open_connection(...)

asyncio.open_connection() 関数でソケット接続を構成するために使用できるパラメーターは複数あります。 2 つの必須パラメータはホストとポートです。

host は、ドメイン名や IP アドレスなど、接続先のサーバーを指定する文字列です。

port はソケットのポート番号です (HTTP サーバーの場合は 80、HTTPS サーバーの場合は 443、SMTP の場合は 23 など)。

...
# open a connection to an http server
reader, writer = await asyncio.open_connection('www.google.com', 80)

SSL プロトコルを介した暗号化されたソケット接続をサポートします。おそらく最も一般的な例は、HTTP を置き換える HTTPS です。これは、「ssl」パラメータを True に設定することで実現できます。

...
# open a connection to an https server
reader, writer = await asyncio.open_connection('www.google.com', 443, ssl=True)

3. サーバーの起動方法

asyncio.start_server() 関数を使用して、asyncio TCP サーバー ソケットを開くことができます。これは待機する必要があるコルーチンです。

この関数は、実行中のサーバーを表す asyncio.Server オブジェクトを返します。

...
# start a tcp server
server = await asyncio.start_server(...)

3 つの必須パラメータは、コールバック関数、ホスト、ポートです。クライアントがサーバーに接続すると、名前付きカスタム関数であるコールバック関数が呼び出されます。

ホストは、クライアントが接続先として指定するドメイン名または IP アドレスです。 FTP で使用されるポートは 21、HTTP で使用されるポートは 80 です。これらのポートは、接続を受信するために使用されるソケットのポート番号です。

# handle connections
async def handler(reader, writer):
	# ...
...
# start a server to receive http connections
server = await asyncio.start_server(handler, '127.0.0.1', 80)

4. StreamWriter を使用してデータを書き込む方法

asyncio.StreamWriter を使用してソケットにデータを転送できます。データはバイト単位で書き込まれます。バイトデータは、write() メソッドを使用してソケットに書き込むことができます。

...
# write byte data
writer.write(byte_data)

また、 writelines() メソッドを使用して、リストまたは反復可能に編成されたバイト データの複数の「行」を書き込むこともできます。

...
# write lines of byte data
writer.writelines(byte_lines)

データ ブロックを書き込んだり、コルーチンの呼び出しを一時停止したりするメソッドはありません。バイトデータを書き込んだ後は、drain() メソッドを使用してソケットを空にするのが最善です。これは、データが転送されソケットの準備ができるまで呼び出し元を一時停止させるコルーチンです。

...
# write byte data
writer.write(byte_data)
# wait for data to be transmitted
await writer.drain()

5. StreamReader を使用してデータを読み取る方法

asyncio.StreamReader を使用してソケット内のデータを読み取ります。データはバイト形式で読み取られるため、文字列を使用する前にエンコードする必要がある場合があります。すべての読み取りメソッドは待機する必要があるコルーチンです。

read() メソッドを使用すると、任意の数のバイトを読み取ることができ、ファイルの終わり (EOF) まで読み取ります。

...
# read byte data
byte_data = await reader.read()

さらに、読み取るバイト数は「n」パラメータで指定できます。次の応答に予想されるバイト数がわかっていると役立つ場合があります。

...
# read byte data
byte_data = await reader.read(n=100)

readline() メソッドを使用して、単一行のデータを読み取ることができます。これにより、改行文字「\n」または EOF が検出されるまでバイトが返されます。

これは、テキスト行で動作する標準プロトコルを読み取るときに便利です。

...
# read a line data
byte_line = await reader.readline()

さらに、正確なバイト数を読み取る readexactly() メソッド (そうでない場合は例外がスローされます) と、指定されたバイト数が読み取られるまでバイトを読み取る readuntil() メソッドがあります。

6. 接続を閉じる方法

asyncio.StreamWriter オブジェクトを使用してネットワーク ソケットを閉じることができます。ソケットは、close() メソッドを呼び出すことで閉じることができます。このメソッドはブロックしません。

...
# close the socket
writer.close()

close() メソッドはノンブロッキングですが、続行する前にソケットが完全に閉じられるまで待つことができます。これは、wait_closed() メソッドを通じて実現できます。これは待つことができるコルーチンです。

...
# close the socket
writer.close()
# wait for the socket to close
await writer.wait_closed()

ソケットが閉じられているか、is_クロージング()メソッドを通じて閉じられつつあるかを確認できます。

rree

以上がPython の非同期ノンブロッキング ストリームの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。