18.5.1. 基底イベントループ¶
イベントループは asyncio
が提供する中心実行デバイスです。以下の多くの機能を提供しています:
遅延呼び出しの登録、実行およびキャンセル (タイムアウト)。
さまざまな種類の通信のためのクライアントおよびサーバー トランスポート の作成。
外部プログラムとの通信のためのサブプロセスおよび関連する トランスポート の起動。
スレッドのプールへ呼び出す、コストの大きい関数の委譲。
-
class
asyncio.
BaseEventLoop
¶ This class is an implementation detail. It is a subclass of
AbstractEventLoop
and may be a base class of concrete event loop implementations found inasyncio
. It should not be used directly; useAbstractEventLoop
instead.BaseEventLoop
should 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 correspondingsocket
module 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
True
on 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_REUSEPORT
constant 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.socket
object 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
, andbytes
paths 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
True
on 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
accept
call. 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_workers
of 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
None
if 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 でのみ動きます。