18.5.1. 基底イベントループ¶
イベントループは asyncio が提供する中心実行デバイスです。以下の多くの機能を提供しています:
遅延呼び出しの登録、実行およびキャンセル (タイムアウト)。
さまざまな種類の通信のためのクライアントおよびサーバー トランスポート の作成。
外部プログラムとの通信のためのサブプロセスおよび関連する トランスポート の起動。
スレッドのプールへ呼び出す、コストの大きい関数の委譲。
-
class
asyncio.BaseEventLoop¶ This class is an implementation detail. It is a subclass of
AbstractEventLoopand may be a base class of concrete event loop implementations found inasyncio. It should not be used directly; useAbstractEventLoopinstead.BaseEventLoopshould not be subclassed by third-party code; the internal interface is not stable.
-
class
asyncio.AbstractEventLoop¶ イベントループの抽象基底クラスです。
このクラスは スレッド安全ではありません。
18.5.1.1. イベントループの実行¶
-
AbstractEventLoop.run_forever()¶ Run until
stop()is called. Ifstop()is called beforerun_forever()is called, this polls the I/O selector once with a timeout of zero, runs all callbacks scheduled in response to I/O events (and those that were already scheduled), and then exits. Ifstop()is called whilerun_forever()is running, this will run the current batch of callbacks and then exit. Note that callbacks scheduled by callbacks will not run in that case; they will run the next timerun_forever()is called.バージョン 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()が返ると呼び出され、制御はイベントループに返されます。これは FIFO キューとして操作し、コールバックは登録された順に呼び出されます。各コールバックは厳密に 1 回だけ呼び出されます。
callback の後の位置引数 args は、コールバックが呼び出されたときに渡されます。
asyncio.Handleのインスタンスを返します。それを使用してコールバックをキャンセルすることが出来ます。
-
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のインスタンスを返します。それを使用してコールバックをキャンセルすることが出来ます。callback は
call_later()を呼び出すたびに厳密に 1 度だけ呼び出されます。2 個のコールバックが完全に同じ時間にスケジュールされている場合、どちらが先に実行されるかは保証されません。コールバックが呼び出されたときに任意の位置引数 args が渡されます。名前付き引数をコールバックに渡したい場合、クロージャか
functools.partial()を使用してください。
-
AbstractEventLoop.call_at(when, callback, *args)¶ 絶対タイムスタンプ when (int または float) になったときに呼び出される callback を準備します。 時刻は
AbstractEventLoop.time()を参照します。このメソッドの振る舞いは
call_later()と同じです。asyncio.Handleのインスタンスを返します。それを使用してコールバックをキャンセルすることが出来ます。
参考
関数 asyncio.sleep()。
18.5.1.4. Futures¶
-
AbstractEventLoop.create_future()¶ ループに付属した
asyncio.Futureオブジェクトを作成します。This is a preferred way to create futures in asyncio, as event loop implementations can provide alternative implementations of the Future class (with better performance or instrumentation).
バージョン 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()が使用するタスクファクトリーを設定します。factory が
Noneの場合デフォルトのタスクファクトリーが設定されます。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_INET6は host (または指定されていれば family) に依存し、ソケットタイプはSOCK_STREAMになります。protocol_factory は プロトコル のインスタンスを返す呼び出し可能オブジェクトでなければなりません。このメソッドはバックグラウンドでコネクションの確立を試みる コルーチン です。成功すると、コルーチンは
(トランスポート, プロトコル)のペアを返します。時系列での下層処理の概要は以下のとおりです:
コネクションを確立し、それを表す トランスポート が作成される。
protocol_factory が引数なしで呼び出され、プロトコル のインスタンスを返す。
プロトコルインスタンスはトランスポートと紐付けられ、それの
connection_made()メソッドが呼び出される。コルーチンは
(トランスポート, プロトコル)のペアを返す。
作成されたトランスポートは実装依存の双方向ストリームです。
注釈
protocol_factory はクラスである必要はなく、あらゆる種類の呼び出し可能オブジェクトを使用可能です。例えば、あらかじめ作成しておいたプロコルインスタンスを使用したい場合、
lambda: my_protocolを渡します。コネクションの作成方法を変更するオプションは以下の通りです:
ssl: 偽値以外が与えられた場合、SSL/TLS トランスポートが作成されます (デフォルトではプレーン TCP トランスポートが作成されます)。ssl が
ssl.SSLContextオブジェクトの場合、このコンテキストはトランスポートを作成するために使用されます; ssl がTrueの場合、いくつかの未定義のデフォルト値が使用されます。server_hostname は ssl 指定時のみ使用し、対象サーバーの証明書に一致するホスト名を設定またはオーバーライドします。デフォルトでは引数 host の値が使用されます。host が空の場合デフォルト値はなく、server_hostname に値を渡さなければなりません。server_hostname が空の場合、ホスト名のマッチングは無効になります (深刻なセキュリティリスクになり、中間者攻撃に対する脆弱性になります)。
family, proto, flags は任意のアドレスファミリであり、host 解決のための getaddrinfo() 経由で渡されるプロトコルおよびフラグになります。このオプションが与えられた場合、これらはすべて
socketモジュール定数に従った整数でなければなりません。sock を与える場合、トランスポートに使用される、既存の、すでに接続済の
socket.socketオブジェクトを指定します。sock を指定する場合、host、port、family、proto、flags および local_addr を指定してはなりません。local_addr を与える場合、ソケットをローカルに束縛するために使用する
(local_host, local_port)のタプルを指定します。local_host および local_port は host および 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_INET6は host (または指定されていれば family) に依存し、ソケットタイプはSOCK_DGRAMです。 protocol_factory は プロトコル のインスタンスを返す呼び出し可能オブジェクトでなければなりません。このメソッドはバックグラウンドでコネクションの確立を試みる コルーチン です。成功すると、コルーチンは
(トランスポート, プロトコル)のペアを返します。コネクションの作成方法を変更するオプションは以下の通りです:
- local_addr, if given, is a
(local_host, local_port)tuple used to bind the socket to locally. The local_host and local_port are looked up usinggetaddrinfo(). - remote_addr, if given, is a
(remote_host, remote_port)tuple used to connect the socket to a remote address. The remote_host and remote_port are looked up usinggetaddrinfo(). - family, proto, flags are the optional address family, protocol
and flags to be passed through to
getaddrinfo()for host resolution. If given, these should all be integers from the correspondingsocketmodule constants. - reuse_address tells the kernel to reuse a local socket in
TIME_WAIT state, without waiting for its natural timeout to
expire. If not specified will automatically be set to
Trueon UNIX. - reuse_port tells the kernel to allow this endpoint to be bound to the
same port as other existing endpoints are bound to, so long as they all
set this flag when being created. This option is not supported on Windows
and some UNIX’s. If the
SO_REUSEPORTconstant is not defined then this capability is unsupported. - allow_broadcast tells the kernel to allow this endpoint to send messages to the broadcast address.
- sock can optionally be specified in order to use a preexisting,
already connected,
socket.socketobject to be used by the transport. If specified, local_addr and remote_addr should be omitted (must beNone).
Windows の
ProactorEventLoopでは、このメソッドはサポートされていません。UDP echo クライアントプロトコル および UDP echo サーバープロトコル の例を参照してください。
- local_addr, if given, is a
-
coroutine
AbstractEventLoop.create_unix_connection(protocol_factory, path, *, ssl=None, sock=None, server_hostname=None)¶ UNIX コネクションを作成します: ソケットファミリは
AF_UNIX、ソケットタイプはSOCK_STREAMになります。AF_UNIXソケットファミリは同一マシン上のプロセス間で効率的に通信するために使用されます。このメソッドはバックグラウンドでコネクションの確立を試みる コルーチン です。成功すると、コルーチンは
(トランスポート, プロトコル)のペアを返します。path is the name of a UNIX domain socket, and is required unless a sock parameter is specified. Abstract UNIX sockets,
str, andbytespaths are supported.引数については
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 サーバは host と port に束縛されます。 host 引数には文字列のシーケンスを渡すことも出来ます。 その場合 TCP サーバはシーケンスの全ホストに束縛されます。 host が空の文字列や
Noneの場合、全インターフェイスが想定され、複数のソケットからなるリストを返します (最も近いのは IPv4 や IPv6 のものです)。family には
socket.AF_INETまたはAF_INET6を指定し、ソケットで IPv4 を使用するか IPv6 を使用するか強制的に設定できます。設定されない場合ホストから決定されます (socket.AF_UNSPECがデフォルトになります)。flags は
getaddrinfo()のためのビットマスクになります。任意の引数 sock には、既存のソケットオブジェクトの使用順を指定できます。指定した場合、host および port を指定してはなりません (
Noneでなければなりません)。backlog は
listen()に渡される、キューに入るコネクションの最大数になります (デフォルトは 100)。ssl には
SSLContextを指定できます。指定すると、受け付けたコネクション上での SSL を有効にします。- reuse_address tells the kernel to reuse a local socket in
TIME_WAIT state, without waiting for its natural timeout to
expire. If not specified will automatically be set to
Trueon UNIX. - reuse_port tells the kernel to allow this endpoint to be bound to the same port as other existing endpoints are bound to, so long as they all set this flag when being created. This option is not supported on 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)¶ Handle an accepted connection.
This is used by servers that accept connections outside of asyncio but that use asyncio to handle them.
引数:
- sock is a preexisting socket object returned from an
acceptcall. ssl には
SSLContextを指定できます。指定すると、受け付けたコネクション上での SSL を有効にします。
This method is a coroutine. When completed, the coroutine returns a
(transport, protocol)pair.- sock is a preexisting socket object returned from an
18.5.1.8. ファイル記述子の監視¶
Windows の SelectorEventLoop では、ソケットの扱いのみサポートされています (例えばパイプのファイル記述子はサポートされません)。
Wndows の ProactorEventLoop では、これらのメソッドはサポートされません。
-
AbstractEventLoop.add_reader(fd, callback, *args)¶ 読み込み可能なファイル記述子の監視を開始し、指定された引数で callback を呼び出します。
-
AbstractEventLoop.remove_reader(fd)¶ 読み込み可能なファイル記述子の監視を停止します。
-
AbstractEventLoop.add_writer(fd, callback, *args)¶ 書き込み可能なファイル記述子の監視を開始し、指定された引数で callback を呼び出します。
-
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_connectはsocket.inet_pton()の呼び出しで address が既に解決されているかチェックしようとします。 解決されていない場合AbstractEventLoop.getaddrinfo()を使用して address を解決します。
-
coroutine
AbstractEventLoop.sock_accept(sock)¶ 接続を受け付けます。
socket.socket.accept()のブロック をモデルにしています。The socket must be bound to an address and listening for connections. The return value is a pair
(conn, address)where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection.ソケット 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_factory は
Protocolインターフェースを持つオブジェクトのインスタンスを作成しなければなりません。 pipe は ファイルライクオブジェクト です。(トランスポート, プロトコル)のペアを返し、 トランスポート はReadTransportインターフェースをサポートします。SelectorEventLoopイベントループの場合、pipe は非ブロックモードに設定されていなければなりません。このメソッドは コルーチン です。
-
coroutine
AbstractEventLoop.connect_write_pipe(protocol_factory, pipe)¶ イベントループ内の書き込みパイプを登録します。
protocol_factory は
BaseProtocolで作成されたインスタンスオブジェクトでなければなりません。pipe は ファイルライクオブジェクト です。(transport, protocol)のペアを返します。transport はWriteTransportインターフェースをサポートしています。SelectorEventLoopイベントループの場合、pipe は非ブロックモードに設定されていなければなりません。このメソッドは コルーチン です。
参考
The AbstractEventLoop.subprocess_exec() and
AbstractEventLoop.subprocess_shell() methods.
18.5.1.12. UNIX シグナル¶
利用できる環境: UNIX のみ。
-
AbstractEventLoop.add_signal_handler(signum, callback, *args)¶ シグナル用のハンドラーを追加します。
シグナルナンバーが誤っているか捕捉不可能な場合
ValueErrorが送出されます。ハンドラーの設定に問題があった場合RuntimeErrorが送出されます。
-
AbstractEventLoop.remove_signal_handler(sig)¶ シグナル用のハンドラーを削除します。
シグナルハンドラーが削除されると
Trueが、されなければFalseを返します。
参考
signal モジュール。
18.5.1.13. 実行者¶
Executor (スレッドプールまたはプロセスプール) 内の関数を呼び出します。デフォルトでは、一つのイベントループは一つのスレッドプール実行者 (ThreadPoolExecutor) を使用します。
-
coroutine
AbstractEventLoop.run_in_executor(executor, func, *args)¶ 特定の実行者で func を呼び出す準備をします。
引数 executor は
Executorのインスタンスでなければなりません。executor がNoneのときデフォルトの実行者が使用されます。Use functools.partial to pass keywords to the *func*.
このメソッドは コルーチン です。
バージョン 3.5.3 で変更:
BaseEventLoop.run_in_executor()no longer configures themax_workersof the thread pool executor it creates, instead leaving it up to the thread pool executor (ThreadPoolExecutor) to set the default.
-
AbstractEventLoop.set_default_executor(executor)¶ run_in_executor()で使用される実行者を設定します。
18.5.1.14. エラーハンドリング API¶
Allows customizing how exceptions are handled in the event loop.
-
AbstractEventLoop.set_exception_handler(handler)¶ handler を新しいイベントループ例外ハンドラーとして設定します。
handler が
Noneの場合、デフォルトの例外ハンドラーが設定されます。handler が呼び出し可能オブジェクトの場合、
(loop, context)に一致するシグニチャを持っていなければなりません。loopは有効なイベントループへの参照で、contextはdictオブジェクトです (コンテキストの詳細についてはcall_exception_handler()ドキュメントを参照してください)。
-
AbstractEventLoop.get_exception_handler()¶ Return the exception handler, or
Noneif the default one is in use.バージョン 3.5.2 で追加.
-
AbstractEventLoop.default_exception_handler(context)¶ デフォルトの例外ハンドラーです。
これは例外が発生したときおよび例外ハンドラーが設定されていないときに呼び出され、デフォルトとは振る舞いの異なるカスタム例外ハンドラーを呼び出すこともできます。
引数 context の意味は
call_exception_handler()と同じです。
-
AbstractEventLoop.call_exception_handler(context)¶ 現在のイベントループ例外ハンドラーを呼び出します。
context は以下のキーを含む
dictオブジェクトです (新しいキーは後で導入されます):‘message’: エラーメッセージ;
‘exception’ (任意): 例外オブジェクト;
‘future’ (任意):
asyncio.Futureインスタンス;‘handle’ (任意):
asyncio.Handleインスタンス;‘protocol’ (任意): プロトコル インスタンス;
‘transport’ (任意): トランスポート インスタンス;
‘socket’ (任意):
socket.socketインスタンス;
注釈
注意: このメソッドはサブクラス化されたイベントループ内でオーバーロードされてはなりません。あらゆるカスタム例外ハンドリングには、
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¶ ソケット上で待機しているサーバーです。
Object created by the
AbstractEventLoop.create_server()method and thestart_server()function. Don’t instantiate the class directly.-
close()¶ サーバーを停止します: 待機しているソケットをクローズし
sockets属性にNoneを設定します。既存の受信中のクライアントとの接続を表すソケットはオープンのままです。
サーバーは非同期に停止されます。サーバーの停止を待ちたい場合は
wait_closed()コルーチンを使用します。
-
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() で現在の日時を表示する¶
Example of callback displaying the current date every second. The callback uses
the AbstractEventLoop.call_later() method to reschedule itself during 5
seconds, and then stops the event loop:
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. 読み込みイベント用ファイル記述子の監視¶
Wait until a file descriptor received some data using the
AbstractEventLoop.add_reader() method and then close the event loop:
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 用のシグナルハンドラーの設定¶
Register handlers for signals SIGINT and SIGTERM using
the AbstractEventLoop.add_signal_handler() method:
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 でのみ動きます。
