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()
してから結果を渡してくれる。
- 引数に Task を取るので、
# 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)