tornado.iostream
— ノンブロッキングソケットの便利なラッパー¶
ノンブロッキングファイルおよびソケットへの書き込みと読み込みを行うためのユーティリティクラス。
目次
BaseIOStream
: 読み書き用の汎用インターフェース。IOStream
: ノンブロッキングソケットを使用した BaseIOStream の実装。SSLIOStream
: SSL 対応版の IOStream。PipeIOStream
: パイプベースの IOStream 実装。
基底クラス¶
- class tornado.iostream.BaseIOStream(max_buffer_size: Optional[int] = None, read_chunk_size: Optional[int] = None, max_write_buffer_size: Optional[int] = None)[ソース]¶
ノンブロッキングファイルまたはソケットとの間で書き込みと読み込みを行うためのユーティリティクラス。
ノンブロッキングの
write()
と、read_*()
メソッドのファミリーをサポートします。操作が完了すると、Awaitable
は読み取られたデータ(またはwrite()
の場合はNone
)で解決されます。保留中のすべてのAwaitable
は、ストリームが閉じられたときにStreamClosedError
で解決されます。BaseIOStream.set_close_callback
を使用して、閉じられたストリームの通知を受けることもできます。エラーのためにストリームが閉じられると、IOStreamの
error
属性に例外オブジェクトが含まれます。サブクラスは、
fileno
、close_fd
、write_to_fd
、read_from_fd
、およびオプションでget_fd_error
を実装する必要があります。BaseIOStream
コンストラクター。- パラメーター
max_buffer_size – バッファリングする受信データの最大量。デフォルトは100MBです。
read_chunk_size – 基になるトランスポートから一度に読み取るデータ量。デフォルトは64KBです。
max_write_buffer_size – バッファリングする送信データの量。デフォルトは無制限です。
バージョン 4.0 で変更:
max_write_buffer_size
パラメーターを追加しました。デフォルトのread_chunk_size
を64KBに変更しました。バージョン 5.0 で変更:
io_loop
引数(バージョン4.1以降非推奨)が削除されました。
メインインターフェース¶
- BaseIOStream.write(data: Union[bytes, memoryview]) Future[None] [ソース]¶
このストリームに指定されたデータを非同期的に書き込みます。
このメソッドは、書き込みが完了したときに(
None
の結果で)解決されるFuture
を返します。data
引数は、bytes
型またはmemoryview
型にすることができます。バージョン 4.0 で変更: コールバックが指定されていない場合は、
Future
を返すようになりました。バージョン 4.5 で変更:
memoryview
引数のサポートを追加しました。バージョン 6.0 で変更:
callback
引数が削除されました。代わりに返されたFuture
を使用してください。
- BaseIOStream.read_bytes(num_bytes: int, partial: bool = False) Awaitable[bytes] [ソース]¶
指定されたバイト数を非同期的に読み込みます。
partial
が true の場合、データは返せるバイト数が存在したらすぐに返されます(ただし、num_bytes
を超えることはありません)。バージョン 4.0 で変更:
partial
引数が追加されました。コールバック引数はオプションになり、省略した場合はFuture
が返されるようになりました。バージョン 6.0 で変更:
callback
およびstreaming_callback
引数が削除されました。代わりに、返されたFuture
を使用してください(streaming_callback
の場合はpartial=True
を使用)。
- BaseIOStream.read_into(buf: bytearray, partial: bool = False) Awaitable[int] [ソース]¶
指定されたバイト数を非同期的に読み込みます。
buf
は、データが読み込まれる書き込み可能なバッファでなければなりません。partial
が true の場合、コールバックはバイトが読み込まれるとすぐに実行されます。それ以外の場合、buf
が読み込まれたデータで完全に満たされたときに実行されます。バージョン 5.0 で新規追加。
バージョン 6.0 で変更:
callback
引数が削除されました。代わりに返されたFuture
を使用してください。
- BaseIOStream.read_until(delimiter: bytes, max_bytes: Optional[int] = None) Awaitable[bytes] [ソース]¶
指定されたデリミタが見つかるまで非同期的に読み込みます。
結果には、デリミタを含む読み込まれたすべてのデータが含まれます。
max_bytes
が None でない場合、max_bytes
バイトより多く読み込まれてもデリミタが見つからない場合は接続が閉じられます。バージョン 4.0 で変更:
max_bytes
引数が追加されました。callback
引数はオプションになり、省略した場合はFuture
が返されるようになりました。バージョン 6.0 で変更:
callback
引数が削除されました。代わりに返されたFuture
を使用してください。
- BaseIOStream.read_until_regex(regex: bytes, max_bytes: Optional[int] = None) Awaitable[bytes] [ソース]¶
指定された正規表現に一致するまで非同期的に読み込みます。
結果には、正規表現に一致するデータと、その前にあるものがすべて含まれます。
max_bytes
が None でない場合、max_bytes
バイトより多く読み込まれても正規表現が満たされない場合は接続が閉じられます。バージョン 4.0 で変更:
max_bytes
引数が追加されました。callback
引数はオプションになり、省略した場合はFuture
が返されるようになりました。バージョン 6.0 で変更:
callback
引数が削除されました。代わりに返されたFuture
を使用してください。
- BaseIOStream.read_until_close() Awaitable[bytes] [ソース]¶
ソケットが閉じられるまで、ソケットからすべてのデータを非同期的に読み込みます。
これは、
max_buffer_size
に達するまで、利用可能なすべてのデータをバッファリングします。フロー制御またはキャンセルが必要な場合は、代わりにread_bytes(partial=True)
を使用したループを使用してください。バージョン 4.0 で変更: コールバック引数はオプションになり、省略した場合は
Future
が返されるようになりました。バージョン 6.0 で変更:
callback
およびstreaming_callback
引数が削除されました。代わりに、返されたFuture
を使用してください(streaming_callback
の場合はread_bytes
とpartial=True
を使用)。
- BaseIOStream.close(exc_info: Union[None, bool, BaseException, Tuple[Optional[Type[BaseException]], Optional[BaseException], Optional[TracebackType]]] = False) None [ソース]¶
このストリームを閉じます。
exc_info
が真の場合、error
属性をsys.exc_info
からの現在の例外に設定します (または、exc_info
がタプルの場合、sys.exc_info
の代わりにそれを使用します)。
- BaseIOStream.set_close_callback(callback: Optional[Callable[[], None]]) None [ソース]¶
ストリームが閉じられたときに、指定されたコールバックを呼び出します。
これは主に、
Future
インターフェースを使用するアプリケーションには必要ありません。ストリームが閉じられると、未処理のすべてのFutures
はStreamClosedError
で解決されます。ただし、他の読み取りまたは書き込みが進行中でないときにストリームが閉じられたことを通知する方法として、依然として役立ちます。他のコールバックベースのインターフェースとは異なり、
set_close_callback
は Tornado 6.0 で削除されませんでした。
サブクラスのメソッド¶
- BaseIOStream.close_fd() None [ソース]¶
このストリームの基になるファイルを閉じます。
close_fd
はBaseIOStream
によって呼び出され、他の場所で呼び出すべきではありません。他のユーザーは代わりにclose
を呼び出す必要があります。
- BaseIOStream.write_to_fd(data: memoryview) int [ソース]¶
基になるファイルに
data
を書き込もうとします。書き込まれたバイト数を返します。
- BaseIOStream.read_from_fd(buf: Union[bytearray, memoryview]) Optional[int] [ソース]¶
基になるファイルから読み取ろうとします。
len(buf)
バイトまで読み取り、バッファに格納します。読み取ったバイト数を返します。読み取るものがなかった場合 (ソケットがEWOULDBLOCK
または同等のものを返した場合) は None を返し、EOF 時はゼロを返します。バージョン 5.0 で変更: インターフェースが再設計され、新しく割り当てられたオブジェクトではなく、バッファーを受け取り、バイト数を返すようになりました。
実装¶
- class tornado.iostream.IOStream(socket: socket, *args: Any, **kwargs: Any)[ソース]¶
ソケットベースの
IOStream
の実装です。このクラスは、
BaseIOStream
の読み取りおよび書き込みメソッドと、connect
メソッドをサポートします。socket
パラメーターは、接続済みでも未接続でも構いません。サーバー操作の場合、ソケットはsocket.accept
を呼び出した結果です。クライアント操作の場合、ソケットはsocket.socket
で作成され、IOStream
に渡す前に接続されているか、IOStream.connect
で接続されているかのいずれかです。このクラスを使用した非常に単純な(そして壊れた)HTTPクライアント
import socket import tornado async def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) stream = tornado.iostream.IOStream(s) await stream.connect(("friendfeed.com", 80)) await stream.write(b"GET / HTTP/1.0\r\nHost: friendfeed.com\r\n\r\n") header_data = await stream.read_until(b"\r\n\r\n") headers = {} for line in header_data.split(b"\r\n"): parts = line.split(b":") if len(parts) == 2: headers[parts[0].strip()] = parts[1].strip() body_data = await stream.read_bytes(int(headers[b"Content-Length"])) print(body_data) stream.close() if __name__ == '__main__': asyncio.run(main())
- connect(address: Any, server_hostname: Optional[str] = None) Future[_IOStreamType] [ソース]¶
ソケットをリモートアドレスに非ブロッキングで接続します。
コンストラクターに渡されたソケットが以前に接続されていない場合にのみ呼び出すことができます。addressパラメーターは、IOStreamコンストラクターに渡されるソケットのタイプに対する
socket.connect
と同じ形式です。たとえば、(ip, port)
タプルです。ここではホスト名も受け入れられますが、同期的に解決され、IOLoopをブロックします。IPアドレスではなくホスト名がある場合は、このメソッドを直接呼び出す代わりに、TCPClient
クラスを使用することをお勧めします。TCPClient
は、非同期DNS解決を実行し、IPv4とIPv6の両方を処理します。callback
が指定されている場合、接続が完了すると引数なしで呼び出されます。指定されていない場合、このメソッドはFuture
を返します(接続が成功した後、その結果はストリーム自体になります)。SSLモードでは、
server_hostname
パラメーターが(ssl_options
で無効にされていない限り)証明書の検証とSNIに使用されます(サポートされている場合。Python 2.7.9+が必要です)。接続が保留中の間は
IOStream.write
を呼び出しても安全です。その場合、接続の準備が整うとすぐにデータが書き込まれます。ソケットが接続される前にIOStream
の読み取りメソッドを呼び出すことは、一部のプラットフォームでは動作しますが、移植性はありません。バージョン 4.0 で変更: コールバックが指定されていない場合は、
Future
を返します。バージョン 4.2 で変更: SSL証明書はデフォルトで検証されます。無効にするには、
ssl_options=dict(cert_reqs=ssl.CERT_NONE)
または適切に設定されたssl.SSLContext
をSSLIOStream
コンストラクターに渡します。バージョン 6.0 で変更:
callback
引数が削除されました。代わりに返されたFuture
を使用してください。
- start_tls(server_side: bool, ssl_options: Optional[Union[Dict[str, Any], SSLContext]] = None, server_hostname: Optional[str] = None) Awaitable[SSLIOStream] [ソース]¶
この
IOStream
をSSLIOStream
に変換します。これにより、クリアテキストモードで始まり、初期ネゴシエーション後(SMTPおよびIMAPの
STARTTLS
拡張など)にSSLに切り替わるプロトコルが有効になります。このメソッドは、ストリームで未処理の読み取りまたは書き込みがある場合、またはIOStreamのバッファーにデータがある場合(オペレーティングシステムのソケットバッファー内のデータは許可されています)は使用できません。つまり、通常は最後のクリアテキストデータを読み書きした直後に使用する必要があります。また、接続後、読み取りまたは書き込みを行う前にすぐに使用することもできます。
ssl_options
引数は、ssl.SSLContext
オブジェクト、またはssl.SSLContext.wrap_socket
関数のキーワード引数の辞書のいずれかです。server_hostname
引数は、ssl_options
で無効にされていない限り、証明書の検証に使用されます。このメソッドは、結果が新しい
SSLIOStream
であるFuture
を返します。このメソッドが呼び出された後、元のストリームでの他の操作は未定義です。このストリームでクローズコールバックが定義されている場合、新しいストリームに転送されます。
バージョン 4.0 で追加.
バージョン 4.2 で変更: SSL証明書はデフォルトで検証されるようになりました。無効にするには、
ssl_options=dict(cert_reqs=ssl.CERT_NONE)
を渡すか、適切に設定された (Python v3.12)のssl.SSLContext
を使用してください。
- class tornado.iostream.SSLIOStream(*args: (Python v3.12)のAny, **kwargs: (Python v3.12)のAny)[ソース]¶
ノンブロッキングSSLソケットへの書き込みと読み取りを行うためのユーティリティクラスです。
コンストラクタに渡されたソケットがすでに接続されている場合は、以下のようにラップする必要があります。
ssl.SSLContext(...).wrap_socket(sock, do_handshake_on_connect=False, **kwargs)
SSLIOStream
を構築する前にラップします。未接続のソケットは、IOStream.connect
が完了したときにラップされます。ssl_options
キーワード引数は、(Python v3.12)のssl.SSLContext
オブジェクトか、(Python v3.12)のssl.SSLContext.wrap_socket
のキーワード引数の辞書である可能性があります。- wait_for_handshake() Future[SSLIOStream] [ソース]¶
初期SSLハンドシェイクが完了するのを待ちます。
callback
が指定された場合、ハンドシェイクが完了すると引数なしで呼び出されます。それ以外の場合、このメソッドは、ハンドシェイク完了後にストリーム自体に解決されるFuture
を返します。ハンドシェイクが完了すると、ピアの証明書やNPN/ALPN選択などの情報が
self.socket
でアクセスできます。このメソッドは、サーバー側のストリームで使用するか、
IOStream.start_tls
を使用した後に使用することを目的としています。IOStream.connect
(すでにハンドシェイクの完了を待機している) では使用しないでください。ストリームごとに一度だけ呼び出すことができます。バージョン 4.2 で新規追加。
バージョン 6.0 で変更:
callback
引数が削除されました。代わりに返されたFuture
を使用してください。
- class tornado.iostream.PipeIOStream(fd: (Python v3.12)のint, *args: (Python v3.12)のAny, **kwargs: (Python v3.12)のAny)[ソース]¶
パイプベースの
IOStream
の実装です。コンストラクタは、オープンファイルオブジェクトではなく、整数ファイルディスクリプタ (たとえば、(Python v3.12)の
os.pipe
によって返されるものなど) を受け取ります。パイプは一般に一方向であるため、PipeIOStream
は読み取りまたは書き込みに使用できますが、両方には使用できません。PipeIOStream
は、Unixベースのプラットフォームでのみ利用可能です。
例外¶
- exception tornado.iostream.StreamClosedError(real_error: (Python v3.12)のOptional[(Python v3.12)のBaseException] = None)[ソース]¶
ストリームが閉じられたときに
IOStream
メソッドによって発生する例外です。ストリームの他のコールバックの *後* (バッファリングされたデータを処理できるようにするため) にクローズコールバックが実行されるようにスケジュールされているため、クローズコールバックが表示される前にこのエラーが表示される場合があります。
real_error
属性には、ストリームを閉じる原因となった基になるエラー (存在する場合) が含まれています。バージョン 4.3 で変更:
real_error
属性を追加しました。