クリプト

APIの実行速度を上げてみた ~非同期処理編~

がくし's icon'
  • がくし
  • 2018/11/14 13:02


Content image


●著者

Content image

がくしです。






Content image


●前回の記事

Content image


●目的

前回同様、APIを使ったプログラミングの実行速度を上げる手法を紹介します。今回は非同期処理を使います。まずはじめに非同期処理の解説をして、最後にAPIへの応用をお見せします。


Content image


●非同期処理とは

複数のタスクを実行する際に、あるタスクの処理が停止している間に別のタスクの処理を進める手法です。各タスクは、coroutineという形式で管理されます。

この説明だけでは分からないと思うので、coroutineについて説明していきます。ポイントは3つあります。


・coroutineの作り方/使い方
・coroiutineの連鎖
・coroutineの並列


それぞれ見てみましょう。


Content image


●coroutineの作り方/使い方


async

関数定義の頭にasyncを書くことで、その関数をcoroutineとすることができます(正確には、関数の実行結果がcoroutineです)。ここでは、parent関数とchild関数をcoroutineとして定義しています。


loop

この3行でcoroutineを実行できるとだけ理解してもらえれば十分です。


Content image


●coroutineの連鎖

複数のcoroutineは、awaitを通じて連鎖させることができます。もう一度コードを見てみましょう。


parentでは「await child(num)」という形で使われています。これは、「child(num)のタスクが完了するまで待ってから以降の処理を行う」という意味になります。これがcroutineの連鎖です。


childでは「await async.sleep(num)」という形で使われています。async.sleep(num)は、「num秒待機する」というタスクを課したcoroutineを返します。


実行結果は以下のようになります。childの完了後に、await以降の処理が行われている事がわかります。


$ python simple_coroutine.py
Bob start
Bob's child waiting...
Bob's child waited 3sec
Bob end


Content image


●coroutineの並列

coroutineは並列することでその真価を発揮します。もう一度、最初の説明を見てみましょう。


複数のタスクを実行する際に、あるタスクの処理が停止している間に別のタスクの処理を進める手法


これは、「coroutineを並列して実行している際に、あるcoroutineがawaitしている間に別のcoroutineの処理を進める」という意味になります。実際のコードを見てみましょう。新しくparallelという関数を追加しました。



新しくparallelという関数を追加しました。BobとAliceという2つのcoroutineを作成し、並列処理をしています。async.waitが、並列処理を管理するcoroutineとなります。実行結果を見てみましょう。


$ python parallel_coroutine.py
Alice start
Alice's child waiting...
Bob start
Bob'child waiting...
Bob's child waited 3sec
Bob end
Alice's child waited 5sec
Alice end


Aliceが開始しAlice's childが待機している間に、Bobが動いている事が分かります。これが、非同期処理です。


Content image


●非同期処理のまとめ

・タスクをcoroutineの形式で管理
・awaitでcoroutineを連鎖
・await中に別のcoroutineを処理


これらを踏まえて、APIへの応用を見てみましょう。


Content image


●コード全文


Content image


●補足

aiohttp

urlopenやrequestは非同期処理に対応していないので、aiohttpを使用。


asyncio.Queue()

非同期処理の出力を管理


Content image


●性能比較

前回と同様に、1000件の記事のlike数を取得するのに要する時間を測定しています。


・シングルスレッド(通常の処理)

Content image

・マルチスレッド(前回作ったもの)

Content image

・非同期処理(今回作ったもの)

Content image


通常の処理が2分程かかるのに対して、非同期処理だと5秒ほどで済むことが分かります。25倍以上の速度改善がなされてます。爆速ですね。

Content image


●最後に

今回は解説にも挑んでみましたが、やはり難しいものですね。ただ、コード自体は小奇麗にまとまってると思うので、せめてそこだけでも誰かのお役に立てれば幸いです。


かしこ。

公開日:2018/11/14
獲得ALIS:45.63
がくし's icon'
  • がくし
  • @gaxiiiiiiiiiiii
養蜂家。暇な時にプログラミングをして遊んでる。

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

Uniswap(ユニスワップ)で$ALISのイールドファーミング(流動性提供)してみた

Like token Tip token
59.99 ALIS
Eye catch
クリプト

【第8回】あの仮想通貨はいま「テレグラム-TON/Gram」

Like token Tip token
69.90 ALIS
Eye catch
クリプト

【初心者向け】JPYCを購入して使ってみました!

Like token Tip token
30.03 ALIS
Eye catch
クリプト

【DeFi】複利でトークンを運用してくれるサイト

Like token Tip token
54.01 ALIS
Eye catch
クリプト

Eth2.0のステークによるDeFiへの影響を考える。

Like token Tip token
44.10 ALIS
Eye catch
クリプト

2021年1月以降バイナンスに上場した銘柄を140文字以内でざっくりレビュー(Twitter向け情報まとめ)

Like token Tip token
38.10 ALIS
Eye catch
クリプト

約2年間ブロックチェ-ンゲームをして

Like token Tip token
61.20 ALIS
Eye catch
クリプト

【初心者向け】$MCHCの基本情報と獲得方法

Like token Tip token
32.32 ALIS
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

Like token Tip token
947.13 ALIS
Eye catch
クリプト

Uniswap v3を完全に理解した

Like token Tip token
18.92 ALIS
Eye catch
クリプト

UNISWAPでALISをETHに交換してみた

Like token Tip token
40.40 ALIS
Eye catch
クリプト

Polygon(Matic)で、よく使うサイト(DeFi,Dapps)をまとめてみた

Like token Tip token
236.30 ALIS