WebAPI 呼出しと Callback (P)

Web API 呼出し

こちらで紹介した Uplink は コルーチン対応の AiohttpClient を使うことで、コルーチンとして使えるようになります。

プログラムは dict 版とクラス(pydantic)版の2つを準備していますが、あまり差はないので dict 版をつかって説明していきます。

変更点

  • class GitHub の変更
    • 実はあまり変更なしです。
    • 変更1:get_repos()async をつけた
    • 変更2:@returns.json() をつけた( .json()await つきで呼ぶのが callback と併用不可なので)
# 定義部
class GitHub(Consumer):  # samples from uplink quickstart page
    """A Python Client for the GitHub API."""

    @returns.json()    # callback 中は result.json() を呼べないので、まとめて処理
    @get("users/{username}/repos")
    async def get_repos(self, username):
        """Get user's public repositories."""
  • GitHub オブジェクトの生成
    • 引数に client=AiohttpClient() を追加
    • GitHub の作成は コルーチン外でおこない、コルーチンの稼働も event_loop を使う
# main 起動部
github = GitHub(base_url="https://api.github.com/", client=AiohttpClient())
loop = asyncio.get_event_loop()
loop.run_until_complete(request_sample())
  • 同期呼出しっぽい呼出しは、これで OK
    • 別コルーチンにスイッチは可能
lst1 = await github.get_repos("plham") 

future と callback

  • future っぽいのはこんな感じ
    • 二つのキーワードを並行問合せ
task2 = asyncio.create_task(github.get_repos("handist"))
task3 = asyncio.create_task(github.get_repos("konan-icpc"))
lst2 = await task2
lst3 = await task3
  • callback は task に対して指定すると、問い合わせ完了時に実行してくれる。
    • 引数に Task を取るので、arg.result() で問合せ結果を使った処理が可能
    • callback は await 不可。
    • GitHub@returns.json() をつけると、.json() してから結果を渡してくれる。
# callback 定義
def callback0(arg: asyncio.Task):
    print("callback called. result > ", arg.result())

# 呼出し側
task3 = asyncio.create_task(github.get_repos("konan-icpc"))
task3.add_done_callback(callback0)