tornado.tcpserver
— 基本的なIOStream
ベースのTCPサーバー¶
ノンブロッキングのシングルスレッドTCPサーバー。
- class tornado.tcpserver.TCPServer(ssl_options: Optional[Union[Dict[str, Any], SSLContext]] = None, max_buffer_size: Optional[int] = None, read_chunk_size: Optional[int] = None)[ソース]¶
ノンブロッキングのシングルスレッドTCPサーバー。
TCPServer
を使用するには、handle_stream
メソッドをオーバーライドするサブクラスを定義します。たとえば、単純なエコーサーバーは次のように定義できます。from tornado.tcpserver import TCPServer from tornado.iostream import StreamClosedError class EchoServer(TCPServer): async def handle_stream(self, stream, address): while True: try: data = await stream.read_until(b"\n") await stream.write(data) except StreamClosedError: break
このサーバーでSSLトラフィックを処理するには、
ssl_options
キーワード引数にssl.SSLContext
オブジェクトを渡します。旧バージョンのPythonとの互換性のため、ssl_options
は、ssl.SSLContext.wrap_socket
メソッドのキーワード引数の辞書である場合もあります。ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"), os.path.join(data_dir, "mydomain.key")) TCPServer(ssl_options=ssl_ctx)
TCPServer
の初期化は、次の3つのパターンのいずれかに従います。listen
: シングルプロセスasync def main(): server = TCPServer() server.listen(8888) await asyncio.Event.wait() asyncio.run(main())
この例では、それ自体で複数のプロセスを作成しませんが、
reuse_port=True
引数がlisten()
に渡されると、プログラムを複数回実行して、マルチプロセスサービスを作成できます。add_sockets
: マルチプロセスsockets = bind_sockets(8888) tornado.process.fork_processes(0) async def post_fork_main(): server = TCPServer() server.add_sockets(sockets) await asyncio.Event().wait() asyncio.run(post_fork_main())
add_sockets
インターフェースはより複雑ですが、tornado.process.fork_processes
と一緒に使用して、単一の親からフォークされたすべてのワーカープロセスでマルチプロセスサービスを実行できます。add_sockets
は、bind_sockets
以外の方法でリスニングソケットを作成する場合、シングルプロセスサーバーでも使用できます。このパターンを使用する場合、イベントループに触れるものは
fork_processes
の前に実行できないことに注意してください。-
server = TCPServer() server.bind(8888) server.start(0) # Forks multiple sub-processes IOLoop.current().start()
このパターンは、Python 3.10以降非推奨になっている
asyncio
モジュールのインターフェースが必要なため、非推奨になりました。start
メソッドで複数のプロセスを作成するサポートは、将来のTornadoバージョンで削除されます。
バージョン 3.1 で追加:
max_buffer_size
引数。バージョン 5.0 で変更:
io_loop
引数が削除されました。- listen(port: int, address: Optional[str] = None, family: AddressFamily = AddressFamily.AF_UNSPEC, backlog: int = 128, flags: Optional[int] = None, reuse_port: bool = False) None [ソース]¶
指定されたポートでの接続の受け入れを開始します。
このメソッドは、複数のポートでリッスンするために複数回呼び出すことができます。
listen
は即座に有効になります。その後でTCPServer.start
を呼び出す必要はありません。ただし、イベントループがまだ実行されていない場合は、開始する必要があります。すべての引数は、
tornado.netutil.bind_sockets
と同じ意味を持ちます。バージョン 6.2 で変更:
tornado.netutil.bind_sockets
に合わせて、family
、backlog
、flags
、およびreuse_port
引数が追加されました。
- add_sockets(sockets: Iterable[socket]) None [ソース]¶
このサーバーが、指定されたソケットでの接続の受け入れを開始するようにします。
sockets
パラメータは、bind_sockets
によって返されるようなソケットオブジェクトのリストです。add_sockets
は通常、マルチプロセスサーバーの初期化をより詳細に制御するために、そのメソッドとtornado.process.fork_processes
と組み合わせて使用されます。
- add_socket(socket: socket) None [ソース]¶
add_sockets
の単数形バージョンです。単一のソケットオブジェクトを受け取ります。
- bind(port: int, address: Optional[str] = None, family: AddressFamily = AddressFamily.AF_UNSPEC, backlog: int = 128, flags: Optional[int] = None, reuse_port: bool = False) None [ソース]¶
このサーバーを、指定されたアドレスの指定されたポートにバインドします。
サーバーを起動するには、
start
を呼び出します。このサーバーを単一プロセスで実行する場合は、bind
とstart
の呼び出しシーケンスのショートカットとして、listen
を呼び出すことができます。アドレスには、IP アドレスまたはホスト名のいずれかを指定できます。ホスト名の場合、サーバーはその名前に関連付けられたすべての IP アドレスでリッスンします。アドレスには、使用可能なすべてのインターフェースでリッスンするために、空の文字列または None を指定できます。ファミリーは、IPv4 または IPv6 アドレスに制限するために、
socket.AF_INET
またはsocket.AF_INET6
のいずれかに設定できます。それ以外の場合は、利用可能な場合は両方が使用されます。backlog
引数は、socket.listen
と同じ意味を持ちます。reuse_port
引数は、bind_sockets
と同じ意味を持ちます。このメソッドは、複数のポートまたはインターフェースでリッスンするために、
start
の前に複数回呼び出すことができます。バージョン 4.4 で変更:
reuse_port
引数が追加されました。バージョン 6.2 で変更:
bind_sockets
に合わせて、flags
引数が追加されました。バージョン 6.2 で非推奨:
bind()
とstart()
の代わりに、listen()
またはadd_sockets()
のいずれかを使用してください。
- start(num_processes: Optional[int] = 1, max_restarts: Optional[int] = None) None [ソース]¶
このサーバーを
IOLoop
で起動します。デフォルトでは、このプロセスでサーバーを実行し、追加の子プロセスをフォークしません。
num_processes が
None
または <= 0 の場合、このマシンで使用可能なコア数を検出し、その数の子プロセスをフォークします。num_processes が指定されていて > 1 の場合、その特定数のサブプロセスをフォークします。スレッドではなくプロセスを使用するため、サーバーコード間で共有メモリはありません。
複数のプロセスは、自動リロードモジュール(または、
autoreload=True
オプションで、tornado.web.Application
、これはdebug=True
のときにデフォルトでTrueになります)と互換性がないことに注意してください。複数のプロセスを使用する場合、TCPServer.start(n)
の呼び出し後まで、IOLoopを作成したり参照したりすることはできません。num_processes
の値が1以外の場合、Windowsではサポートされていません。max_restarts
引数は、fork_processes
に渡されます。バージョン 6.0 で変更:
max_restarts
引数が追加されました。バージョン 6.2 で非推奨:
bind()
とstart()
の代わりに、listen()
またはadd_sockets()
のいずれかを使用してください。
- handle_stream(stream: IOStream, address: tuple) Optional[Awaitable[None]] [ソース]¶
受信接続からの新しい
IOStream
を処理するためにオーバーライドします。このメソッドはコルーチンにすることができます。その場合、非同期的に発生した例外はログに記録されます。このコルーチンによって、受信接続の受け入れがブロックされることはありません。
この
TCPServer
がSSL用に構成されている場合、handle_stream
はSSLハンドシェイクが完了する前に呼び出される可能性があります。クライアントの証明書を検証したり、NPN/ALPNを使用する必要がある場合は、SSLIOStream.wait_for_handshake
を使用してください。バージョン 4.2 で変更: このメソッドをコルーチンにするオプションが追加されました。