python の asyncio について調べる その4.5
前回 で ensure_future()
が出てきたので、 以前 に「おまじない」としていた部分を説明できるようになった。
取り敢えず該当コードを再度抜粋する。
... # XXX: おまじないとして ensure_future を呼ぶ。 asyncio.ensure_future( # 名前解決、 socket 接続、 TCP 用の transport インスタンス作成、 # protocol インスタンス作成、 transport と protocol のひも付け、 # 辺りまでやってくれる event loop のメソッド呼び出し。 loop.create_connection(HelloProtocol, '127.0.0.1', 9999)) ...
Event loop の create_connection()
メソッドは、 コメントにあるとおり名前解決や socket 接続といった非同期処理を行うため、 これも coroutine として実装されている。
Coroutine はそのままでは動作しないので、 coroutine を進めるため、また future の結果を coroutine に戻すため、 ensure_future()
で task にくるんでやる必要がある。