memo

2016-06-07

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 にくるんでやる必要がある。