18.5.1. 基底イベントループ

イベントループは asyncio が提供する中心実行デバイスです。以下の多くの機能を提供しています:

  • 遅延呼び出しの登録、実行およびキャンセル (タイムアウト)。
  • さまざまな種類の通信のためのクライアントおよびサーバー トランスポート の作成。
  • 外部プログラムとの通信のためのサブプロセスおよび関連する トランスポート の起動。
  • スレッドのプールへ呼び出す、コストの大きい関数の委譲。
class asyncio.BaseEventLoop

このクラスは実装詳細です。 AbstractEventLoop のサブクラスであり、 asyncio にあるイベントループを実装した具象クラスの基底クラスになっていることがあります。このクラスは直接使うべきではありません。 AbstractEventLoop を代わりに使用してください。サードパーティのコードで BaseEventLoop をサブクラス化すべきではありません。このクラスの内部のインタフェースは安定していません。

class asyncio.AbstractEventLoop

イベントループの抽象基底クラスです。

このクラスは スレッド安全ではありません

18.5.1.1. イベントループの実行

AbstractEventLoop.run_forever()

stop() が呼ばれるまで実行します。もし run_forever() が呼ばれる前に stop() が呼ばれた場合、このメソッドは I/O セレクターをタイムアウト時間ゼロで一度ポーリングして、そこで検出された I/O イベントに応じて実行がスケジュールされたコールバックすべて (に加えて元々スケジュールされていたもの) を実行した後、終了します。もし run_forever() の実行中に stop() が呼ばれた場合、現在バッチ処理中のコールバックを実行した後に終了します。なお、この場合はコールバック内でスケジュールされたコールバックは実行されません。それらは次に run_forever() が呼ばれたときに実行されます。

バージョン 3.5.1 で変更.

AbstractEventLoop.run_until_complete(future)

Future が完了するまで実行します。

引数が コルーチンオブジェクト の場合、ensure_future() でラップされます。

Future の結果を返すか、例外を送出します。

AbstractEventLoop.is_running()

イベントループの実行状態を返します。

AbstractEventLoop.stop()

実行中のイベントループを停止します。

これにより、 run_forever() は次の適当な時に終了します (詳細はそちらを参照してください)。

バージョン 3.5.1 で変更.

AbstractEventLoop.is_closed()

イベントループが閉じられていた場合 True を返します。

バージョン 3.4.2 で追加.

AbstractEventLoop.close()

イベントループを閉じます。ループは実行中ではいけません。保留中のコールバックは失われます。

これはキューをクリアし実行者をシャットダウンしますが、実行者の終了を待ちません。

これは冪等 (訳注: 何回行っても結果が同じ) であり取り消せません。この後他のメソッドを呼び出してはなりません。

18.5.1.2. 呼び出し (call)

asyncio 関数の大半はキーワードを受け付けません。 コールバックに引数を渡したい場合は functools.partial() を使用してください。 例えば loop.call_soon(functools.partial(print, "Hello", flush=True))print("Hello", flush=True) を呼び出します。

注釈

lambda 関数よりも functools.partial() を使用しましょう。 asyncio はデバッグモードで引数を表示するよう functools.partial() オブジェクトを精査することが出来ますが、lambda 関数の表現は貧弱です。

AbstractEventLoop.call_soon(callback, *args)

コールバックをすぐに呼び出せるように準備します。 コールバックは call_soon() が返ると呼び出され、制御はイベントループに返されます。

This operates as a FIFO queue, callbacks are called in the order in which they are registered. Each callback will be called exactly once.

callback の後の位置引数 args は、コールバックが呼び出されたときに渡されます。

asyncio.Handle のインスタンスを返します。それを使用してコールバックをキャンセルすることが出来ます。

コールバックに引数を渡すには functools.partial を使用してください

AbstractEventLoop.call_soon_threadsafe(callback, *args)

call_soon() に似ていますが、スレッドセーフです。

このドキュメントの asyncio-multithreading 節を参照してください。

18.5.1.3. 遅延呼び出し

イベントループはタイムアウトを計測するために自身に内部時計を持っています。内部時計は (プラットフォーム固有の) イベントループの実装に依存したものが使用されます。理想的には、これは単調時計 (訳注: 巻き戻ることのない時計) です。これは通常 time.time() とは異なる時計です。

注釈

タイムアウト (相対値 delay または絶対値 when) は 1 日を超えてはいけません。

AbstractEventLoop.call_later(delay, callback, *args)

引数 delay 秒後に callback を呼び出す準備をします。delay は int または float です。

asyncio.Handle のインスタンスを返します。それを使用してコールバックをキャンセルすることが出来ます。

callbackcall_later() を呼び出すたびに厳密に 1 度だけ呼び出されます。2 個のコールバックが完全に同じ時間にスケジュールされている場合、どちらが先に実行されるかは保証されません。

コールバックが呼び出されたときに任意の位置引数 args が渡されます。名前付き引数をコールバックに渡したい場合、クロージャか functools.partial() を使用してください。

コールバックに引数を渡すには functools.partial を使用してください

AbstractEventLoop.call_at(when, callback, *args)

絶対タイムスタンプ when (int または float) になったときに呼び出される callback を準備します。 時刻は AbstractEventLoop.time() を参照します。

このメソッドの振る舞いは call_later() と同じです。

asyncio.Handle のインスタンスを返します。それを使用してコールバックをキャンセルすることが出来ます。

コールバックに引数を渡すには functools.partial を使用してください

AbstractEventLoop.time()

現在の時刻を float 値で返します。時刻はイベントループの内部時計に従います。

参考

関数 asyncio.sleep()

18.5.1.4. Future

AbstractEventLoop.create_future()

ループに付属した asyncio.Future オブジェクトを作成します。

asyncio で Futures を作成するために推奨される方法です。イベントループを実装することにより、Futures クラスの(パフォーマンスや計測方法が優れた) 代替実装 が提供される場合があるためです。

バージョン 3.5.2 で追加.

18.5.1.5. タスク

AbstractEventLoop.create_task(coro)

コルーチンオブジェクト の実行をスケジュールします: このときフューチャにラップします。Task オブジェクトを返します。

サードパーティのイベントループは相互運用のための自身の Task のサブクラスを使用できます。この場合、結果は Task のサブクラスになります。

このメソッドは Python 3.4.2 で追加されました。Python の過去のバージョンもサポートするには async() 関数を使用してください。

バージョン 3.4.2 で追加.

AbstractEventLoop.set_task_factory(factory)

AbstractEventLoop.create_task() が使用するタスクファクトリーを設定します。

factoryNone の場合デフォルトのタスクファクトリーが設定されます。

factory呼び出し可能オブジェクト の場合、 (loop, coro) に一致するシグニチャを持っていなければなりません。 loop は有効なイベントループへの参照で、 coro はコルーチンオブジェクトです。 呼び出し可能オブジェクトは asyncio.Future 互換のオブジェクトを返さなければなりません。

バージョン 3.4.4 で追加.

AbstractEventLoop.get_task_factory()

タスクファクトリーを返します。デフォルトのものが使用された場合は None を返します。

バージョン 3.4.4 で追加.

18.5.1.6. コネクションの作成

coroutine AbstractEventLoop.create_connection(protocol_factory, host=None, port=None, *, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None)

インターネット host および port へのストリーミング転送コネクションを作成します: ソケットファミリ AF_INET または AF_INET6host (または指定されていれば family) に依存し、ソケットタイプは SOCK_STREAM になります。protocol_factoryプロトコル のインスタンスを返す呼び出し可能オブジェクトでなければなりません。

このメソッドはバックグラウンドでコネクションの確立を試みる コルーチン です。成功すると、コルーチンは (トランスポート, プロトコル) のペアを返します。

時系列での下層処理の概要は以下のとおりです:

  1. コネクションを確立し、それを表す トランスポート が作成される。
  2. protocol_factory が引数なしで呼び出され、プロトコル のインスタンスを返す。
  3. プロトコルインスタンスはトランスポートと紐付けられ、それの connection_made() メソッドが呼び出される。
  4. コルーチンは (トランスポート, プロトコル) のペアを返す。

作成されたトランスポートは実装依存の双方向ストリームです。

注釈

protocol_factory はクラスである必要はなく、あらゆる種類の呼び出し可能オブジェクトを使用可能です。例えば、あらかじめ作成しておいたプロコルインスタンスを使用したい場合、lambda: my_protocol を渡します。

コネクションの作成方法を変更するオプションは以下の通りです:

  • ssl: 偽値以外が与えられた場合、SSL/TLS トランスポートが作成されます (デフォルトではプレーン TCP トランスポートが作成されます)。sslssl.SSLContext オブジェクトの場合、このコンテキストはトランスポートを作成するために使用されます; sslTrue の場合、いくつかの未定義のデフォルト値が使用されます。

  • server_hostnamessl 指定時のみ使用し、対象サーバーの証明書に一致するホスト名を設定またはオーバーライドします。デフォルトでは引数 host の値が使用されます。host が空の場合デフォルト値はなく、server_hostname に値を渡さなければなりません。server_hostname が空の場合、ホスト名のマッチングは無効になります (深刻なセキュリティリスクになり、中間者攻撃に対する脆弱性になります)。

  • family, proto, flags は任意のアドレスファミリであり、host 解決のための getaddrinfo() 経由で渡されるプロトコルおよびフラグになります。このオプションが与えられた場合、これらはすべて socket モジュール定数に従った整数でなければなりません。

  • sock を与える場合、トランスポートに使用される、既存の、すでに接続済の socket.socket オブジェクトを指定します。sock を指定する場合、hostportfamilyprotoflags および local_addr を指定してはなりません。

  • local_addr を与える場合、ソケットをローカルに束縛するために使用する (local_host, local_port) のタプルを指定します。local_host および local_porthost および port と同様に getaddrinfo() を使用してルックアップされます。

バージョン 3.5 で変更: Windows の ProactorEventLoop で SSL/TLS がサポートされました。

参考

関数 open_connection() はプロトコルではなく (StreamReader, StreamWriter) のペアの取得に使用できます。

coroutine AbstractEventLoop.create_datagram_endpoint(protocol_factory, local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, reuse_address=None, reuse_port=None, allow_broadcast=None, sock=None)

データグラム接続を作成します: ソケットファミリー AF_INET または AF_INET6host (または指定されていれば family) に依存し、ソケットタイプは SOCK_DGRAM です。 protocol_factoryプロトコル のインスタンスを返す呼び出し可能オブジェクトでなければなりません。

このメソッドはバックグラウンドでコネクションの確立を試みる コルーチン です。成功すると、コルーチンは (トランスポート, プロトコル) のペアを返します。

コネクションの作成方法を変更するオプションは以下の通りです:

  • local_addr が指定される場合、(local_host, local_port) のタプルで、ソケットをローカルで束縛するために使用されます。local_hostlocal_portgetaddrinfo() を使用して検索されます。
  • remote_addr が指定される場合、(remote_host, remote_por) のタプルで、ソケットをリモートアドレスに束縛するために使用されます。remote_hostremote_portgetaddrinfo() を使用して検索されます。
  • family, proto, flags は任意のアドレスファミリです。これらのファミリ、プロトコル、フラグは、host 解決のため getaddrinfo() 経由でオプションで渡されます。これらのオプションを指定する場合、すべて socket モジュール定数に従った整数でなければなりません。
  • reuse_address は、 TIME_WAIT 状態にあるローカルソケットを、その状態が自然にタイムアウトするのを待つことなく再利用するようカーネルに指示します(訳註: ソケットのオプション SO_REUSEADDR を使用します)。指定しない場合、UNIX では自動的に True が設定されます。
  • reuse_port は、同じポートにバインドされた既存の端点すべてがこのフラグを設定して生成されている場合に限り、この端点を既存の端点と同じポートにバインドすることをカーネルに許可します(訳註: ソケットのオプション SO_REUSEPORT を使用します)。このオプションは、Windows やいくつかの UNIX システムではサポートされません。もし定数 SO_REUSEPORT が定義されていなければ、この機能はサポートされません。
  • allow_broadcast は、カーネルに、このエンドポイントがブロードキャストアドレスにメッセージを送信することを許可するように指示します。
  • オプションの sock を指定することで、既存の、すでに接続されている socket.socket をトランスポートで使用することができます。このオプションを使用する場合、local_addrremote_addr は省略してください (None でなければなりません)。

Windows の ProactorEventLoop では、このメソッドはサポートされていません。

UDP echo クライアントプロトコル および UDP echo サーバープロトコル の例を参照してください。

coroutine AbstractEventLoop.create_unix_connection(protocol_factory, path, *, ssl=None, sock=None, server_hostname=None)

UNIX コネクションを作成します: ソケットファミリは AF_UNIX、ソケットタイプは SOCK_STREAM になります。AF_UNIX ソケットファミリは同一マシン上のプロセス間で効率的に通信するために使用されます。

このメソッドはバックグラウンドでコネクションの確立を試みる コルーチン です。成功すると、コルーチンは (トランスポート, プロトコル) のペアを返します。

path は UNIX ドメインソケットの名前で、 sock パラメータが指定されない限り指定する必要があります。抽象化された UNIX ソケット、 str 、そして bytes のパスを指定できます。

引数については AbstractEventLoop.create_connection() メソッドを参照してください。

利用できる環境: UNIX。

18.5.1.7. 待ち受けコネクションの作成

coroutine AbstractEventLoop.create_server(protocol_factory, host=None, port=None, *, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None)

host および port に束縛された TCP サーバー (ソケットタイプ SOCK_STREAM) を作成します。

Server オブジェクトを返します。これの sockets 属性には作成されたソケットが含まれています。サーバーを停止するには Server.close() メソッドを使用します: 待受中のソケットを閉じます。

引数:

  • host 引数には文字列を渡すことが出来ます。 その場合、TCP サーバは hostport に束縛されます。 host 引数には文字列のシーケンスを渡すことも出来ます。 その場合 TCP サーバはシーケンスの全ホストに束縛されます。 host が空の文字列や None の場合、全インターフェイスが想定され、複数のソケットからなるリストを返します (最も近いのは IPv4 や IPv6 のものです)。
  • family には socket.AF_INET または AF_INET6 を指定し、ソケットで IPv4 を使用するか IPv6 を使用するか強制的に設定できます。設定されない場合ホストから決定されます (socket.AF_UNSPEC がデフォルトになります)。
  • flagsgetaddrinfo() のためのビットマスクになります。
  • 任意の引数 sock には、既存のソケットオブジェクトの使用順を指定できます。指定した場合、host および port を指定してはなりません (None でなければなりません)。
  • backloglisten() に渡される、キューに入るコネクションの最大数になります (デフォルトは 100)。
  • ssl には SSLContext を指定できます。指定すると、受け付けたコネクション上での SSL を有効にします。
  • reuse_address は、 TIME_WAIT 状態にあるローカルソケットを、その状態が自然にタイムアウトするのを待つことなく再利用するようカーネルに指示します(訳註: ソケットのオプション SO_REUSEADDR を使用します)。指定しない場合、UNIX では自動的に True が設定されます。
  • reuse_port は、同じポートにバインドされた既存の端点すべてがこのフラグを設定して生成されている場合に限り、この端点を既存の端点と同じポートにバインドすることを許可するよう、カーネルに指示します(訳註: ソケットのオプション SO_REUSEPORT を使用します)。このオプションは、Windows ではサポートされていません。

このメソッドは コルーチン です。

バージョン 3.5 で変更: Windows の ProactorEventLoop で SSL/TLS がサポートされました。

参考

関数 start_server() は (StreamReader, StreamWriter) のペアを作成し、このペアで関数を再度呼び出します。

バージョン 3.5.1 で変更: host 引数に文字列のシーケンスを与えられるようになりました。

coroutine AbstractEventLoop.create_unix_server(protocol_factory, path=None, *, sock=None, backlog=100, ssl=None)

AbstractEventLoop.create_server() と似ていますが、ソケットファミリー AF_UNIX 固有です。

このメソッドは コルーチン です。

利用できる環境: UNIX。

coroutine BaseEventLoop.connect_accepted_socket(protocol_factory, sock, *, ssl=None)

受け付けられた接続を扱います。

asyncio の範囲外で接続を受け付けるが、asyncio を使用してそれらを扱うサーバにより使用されます。

引数:

  • sock は、 accept 呼び出しが返す既存のソケットオブジェクトです。
  • ssl には SSLContext を指定できます。指定すると、受け付けたコネクション上での SSL を有効にします。

このメソッドは coroutine です。完了すると、このコルーチンは (transport, protocol) のペアを返します。

18.5.1.8. ファイル記述子の監視

Windows の SelectorEventLoop では、ソケットの扱いのみサポートされています (例えばパイプのファイル記述子はサポートされません)。

Wndows の ProactorEventLoop では、これらのメソッドはサポートされません。

AbstractEventLoop.add_reader(fd, callback, *args)

読み込み可能なファイル記述子の監視を開始し、指定された引数で callback を呼び出します。

コールバックに引数を渡すには functools.partial を使用してください

AbstractEventLoop.remove_reader(fd)

読み込み可能なファイル記述子の監視を停止します。

AbstractEventLoop.add_writer(fd, callback, *args)

書き込み可能なファイル記述子の監視を開始し、指定された引数で callback を呼び出します。

コールバックに引数を渡すには functools.partial を使用してください

AbstractEventLoop.remove_writer(fd)

書き込み可能なファイル記述子の監視を停止します。

読み込みイベント用のファイル記述子の監視 の例では、ソケットのファイル記述子を登録するのに低水準の AbstractEventLoop.add_reader() メソッドを使用しています。

18.5.1.9. 低水準のソケット操作

coroutine AbstractEventLoop.sock_recv(sock, nbytes)

ソケットからデータを受け取ります。 socket.socket.recv() メソッドのブロックをモデルにしています。

受け取ったデータを表す bytes オブジェクトを返します。 一度に受け取るデータの最大量を nbytes で指定します。

SelectorEventLoop イベントループの場合、ソケット sock は非ブロックでなければなりません。

このメソッドは コルーチン です。

coroutine AbstractEventLoop.sock_sendall(sock, data)

ソケットにデータを送ります。 socket.socket.sendall() メソッドのブロックをモデルにいています。

ソケットはリモートソケットに接続されていなければなりません。 このメソッドは全データを送信するかエラーが発生するまで、 data からのデータを送信し続けます。 正常終了すると None を返します。 エラー発生時は例外を送出しますが、正常に処理されたデータ量を確認する手段はありません。 たとえあったとしても、接続の終了を受信するまではできません。

SelectorEventLoop イベントループの場合、ソケット sock は非ブロックでなければなりません。

このメソッドは コルーチン です。

coroutine AbstractEventLoop.sock_connect(sock, address)

address のソケットに接続します。 socket.socket.connect() メソッドのブロックをモデルにしています。

SelectorEventLoop イベントループの場合、ソケット sock は非ブロックでなければなりません。

このメソッドは コルーチン です。

バージョン 3.5.2 で変更: address を解決する必要はなくなりました。 sock_connectsocket.inet_pton() の呼び出しで address が既に解決されているかチェックしようとします。 解決されていない場合 AbstractEventLoop.getaddrinfo() を使用して address を解決します。

coroutine AbstractEventLoop.sock_accept(sock)

接続を受け付けます。 socket.socket.accept() のブロック をモデルにしています。

ソケットはアドレスに束縛済みで、接続を listen 中である必要があります。戻り値は (conn, address) のペアで、conn は接続を通じてデータの送受信を行うための 新しい ソケットオブジェクト、address は接続先の端点でソケットに束縛されているアドレスを示します。

ソケット sock は非ブロックでなければなりません。

このメソッドは コルーチン です。

18.5.1.10. ホスト名の解決

coroutine AbstractEventLoop.getaddrinfo(host, port, *, family=0, type=0, proto=0, flags=0)

このメソッドは コルーチン で、socket.getaddrinfo() 関数に似ていますが、ブロックされません。

coroutine AbstractEventLoop.getnameinfo(sockaddr, flags=0)

このメソッドは コルーチン で、socket.getnameinfo() 関数に似ていますが、ブロックされません。

18.5.1.11. パイプの接続

Windows の SelectorEventLoop では、これらメソッドはサポートされていません。Windows でパイプをサポートするには、ProactorEventLoop を使用してください。

coroutine AbstractEventLoop.connect_read_pipe(protocol_factory, pipe)

イベントループ内で読み込みパイプを登録します。

protocol_factoryProtocol インターフェースを持つオブジェクトのインスタンスを作成しなければなりません。 pipeファイルライクオブジェクト です。 (トランスポート, プロトコル) のペアを返し、 トランスポートReadTransport インターフェースをサポートします。

SelectorEventLoop イベントループの場合、pipe は非ブロックモードに設定されていなければなりません。

このメソッドは コルーチン です。

coroutine AbstractEventLoop.connect_write_pipe(protocol_factory, pipe)

イベントループ内の書き込みパイプを登録します。

protocol_factoryBaseProtocol で作成されたインスタンスオブジェクトでなければなりません。pipeファイルライクオブジェクト です。(transport, protocol) のペアを返します。transportWriteTransport インターフェースをサポートしています。

SelectorEventLoop イベントループの場合、pipe は非ブロックモードに設定されていなければなりません。

このメソッドは コルーチン です。

参考

AbstractEventLoop.subprocess_exec() メソッドおよび AbstractEventLoop.subprocess_shell() メソッド。

18.5.1.12. UNIX シグナル

利用できる環境: UNIX のみ。

AbstractEventLoop.add_signal_handler(signum, callback, *args)

シグナル用のハンドラーを追加します。

シグナルナンバーが誤っているか捕捉不可能な場合 ValueError が送出されます。ハンドラーの設定に問題があった場合 RuntimeError が送出されます。

コールバックに引数を渡すには functools.partial を使用してください

AbstractEventLoop.remove_signal_handler(sig)

シグナル用のハンドラーを削除します。

シグナルハンドラーが削除されると True が、されなければ False を返します。

参考

signal モジュール。

18.5.1.13. 実行者

Executor (スレッドプールまたはプロセスプール) 内の関数を呼び出します。デフォルトでは、一つのイベントループは一つのスレッドプール実行者 (ThreadPoolExecutor) を使用します。

coroutine AbstractEventLoop.run_in_executor(executor, func, *args)

特定の実行者で func を呼び出す準備をします。

引数 executorExecutor のインスタンスでなければなりません。executorNone のときデフォルトの実行者が使用されます。

*func* にキーワードを渡すには、functools.partial を使用します

このメソッドは コルーチン です。

バージョン 3.5.3 で変更: BaseEventLoop.run_in_executor() は、作成するスレッドプール実行者の max_workers を作成しなくなり、代わりにスレッドプール実行者 (ThreadPoolExecutor) にデフォルトを設定させるようになりました。

AbstractEventLoop.set_default_executor(executor)

run_in_executor() で使用される実行者を設定します。

18.5.1.14. エラーハンドリング API

イベントループ内での例外の扱い方をカスタマイズできます。

AbstractEventLoop.set_exception_handler(handler)

handler を新しいイベントループ例外ハンドラーとして設定します。

handlerNone の場合、デフォルトの例外ハンドラーが設定されます。

handler が呼び出し可能オブジェクトの場合、(loop, context) に一致するシグニチャを持っていなければなりません。 loop は有効なイベントループへの参照で、contextdict オブジェクトです (コンテキストの詳細については call_exception_handler() ドキュメントを参照してください)。

AbstractEventLoop.get_exception_handler()

例外ハンドラを返します。デフォルトのものが使用されている場合は None を返します。

バージョン 3.5.2 で追加.

AbstractEventLoop.default_exception_handler(context)

デフォルトの例外ハンドラーです。

これは例外が発生したときおよび例外ハンドラーが設定されていないときに呼び出され、デフォルトとは振る舞いの異なるカスタム例外ハンドラーを呼び出すこともできます。

引数 context の意味は call_exception_handler() と同じです。

AbstractEventLoop.call_exception_handler(context)

現在のイベントループ例外ハンドラーを呼び出します。

context は以下のキーを含む dict オブジェクトです (新しいキーは後で導入されます):

注釈

注意: このメソッドはサブクラス化されたイベントループ内でオーバーロードされてはなりません。あらゆるカスタム例外ハンドリングには、set_exception_handler() メソッドを使用してください。

18.5.1.15. デバッグモード

AbstractEventLoop.get_debug()

イベントループのデバッグモード (bool) を取得します。

環境変数 PYTHONASYNCIODEBUG に空でない文字列が設定されている場合のデフォルト値は True、そうでない場合は False になります。

バージョン 3.4.2 で追加.

AbstractEventLoop.set_debug(enabled: bool)

イベントループのデバッグモードを設定します。

バージョン 3.4.2 で追加.

18.5.1.16. サーバー

class asyncio.Server

ソケット上で待機しているサーバーです。

AbstractEventLoop.create_server() メソッドおよび start_server() 関数によって作成されたオブジェクトです。クラスから直接インスタンスを作成しないでください。

close()

サーバーを停止します: 待機しているソケットをクローズし sockets 属性に None を設定します。

既存の受信中のクライアントとの接続を表すソケットはオープンのままです。

サーバーは非同期に停止されます。サーバーの停止を待ちたい場合は wait_closed() コルーチンを使用します。

coroutine wait_closed()

close() メソッドが完了するまで待ちます。

このメソッドは コルーチン です。

sockets

サーバーが待機している socket.socket オブジェクトのリストです。サーバーが停止しているときは None になります。

18.5.1.17. ハンドル

class asyncio.Handle

AbstractEventLoop.call_soon(), AbstractEventLoop.call_soon_threadsafe(), AbstractEventLoop.call_later(), および AbstractEventLoop.call_at() が返すコールバックラッパです。

cancel()

呼び出しをキャンセルします。コールバックが既にキャンセルされていたり実行されていた場合、このメソッドの影響はありません。

18.5.1.18. イベントループの例

18.5.1.18.1. call_soon() を使った Hello World

AbstractEventLoop.call_soon() メソッドを使用してコールバックをスケジュールする例です。 コールバックは "Hello World" を表示してイベントループを停止します:

import asyncio

def hello_world(loop):
    print('Hello World')
    loop.stop()

loop = asyncio.get_event_loop()

# Schedule a call to hello_world()
loop.call_soon(hello_world, loop)

# Blocking call interrupted by loop.stop()
loop.run_forever()
loop.close()

参考

コルーチンを使った Hello World の例では コルーチン を使用しています。

18.5.1.18.2. call_later() で現在の日時を表示する

現在の日時を毎秒表示するコールバックの例です。コールバックは AbstractEventLoop.call_later() を使用して 5 秒間自身を再スケジュールし、イベントループを停止します。

import asyncio
import datetime

def display_date(end_time, loop):
    print(datetime.datetime.now())
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, display_date, end_time, loop)
    else:
        loop.stop()

loop = asyncio.get_event_loop()

# Schedule the first call to display_date()
end_time = loop.time() + 5.0
loop.call_soon(display_date, end_time, loop)

# Blocking call interrupted by loop.stop()
loop.run_forever()
loop.close()

参考

現在の日時を表示するコルーチン の例は コルーチン を使用しています。

18.5.1.18.3. 読み込みイベント用ファイル記述子の監視

ファイル記述子が AbstractEventLoop.add_reader() を使用してデータを受信するまで待機し、その後イベントループを閉じます。

import asyncio
try:
    from socket import socketpair
except ImportError:
    from asyncio.windows_utils import socketpair

# Create a pair of connected file descriptors
rsock, wsock = socketpair()
loop = asyncio.get_event_loop()

def reader():
    data = rsock.recv(100)
    print("Received:", data.decode())
    # We are done: unregister the file descriptor
    loop.remove_reader(rsock)
    # Stop the event loop
    loop.stop()

# Register the file descriptor for read event
loop.add_reader(rsock, reader)

# Simulate the reception of data from the network
loop.call_soon(wsock.send, 'abc'.encode())

# Run the event loop
loop.run_forever()

# We are done, close sockets and the event loop
rsock.close()
wsock.close()
loop.close()

参考

プロトコルを使ってデータを待つオープンソケットの登録 の例では AbstractEventLoop.create_connection() メソッドによって作成された低レベルプロトコルを使用しています。

ストリームを使ってデータを待つオープンソケットの登録 の例ではコルーチンの open_connection() 関数によって作成された高水準ストリームを使用しています。

18.5.1.18.4. SIGINT および SIGTERM 用のシグナルハンドラーの設定

AbstractEventLoop.add_signal_handler() メソッドを使用した、シグナル SIGINT および SIGTERM 用のハンドラを登録します。

import asyncio
import functools
import os
import signal

def ask_exit(signame):
    print("got signal %s: exit" % signame)
    loop.stop()

loop = asyncio.get_event_loop()
for signame in ('SIGINT', 'SIGTERM'):
    loop.add_signal_handler(getattr(signal, signame),
                            functools.partial(ask_exit, signame))

print("Event loop running forever, press Ctrl+C to interrupt.")
print("pid %s: send SIGINT or SIGTERM to exit." % os.getpid())
try:
    loop.run_forever()
finally:
    loop.close()

この例は UNIX でのみ動きます。