【非同期処理】Pythonの async / await 構文を使ってみよう!

Pythonプログラミング VTuber サプー
18 Aug 202316:55

Summary

TLDRこのビデオはPythonの非同期処理について解説しています。非同期処理とは処理の完了を待たずに別の処理を実行できる機能で、入出力処理などにおいて効果的です。ビデオではasyncioモジュールを使った非同期処理の基本的なコードの書き方と、タスクの並列実行、ギャザーによる複数の戻り値の取得などについて解説しています。そして実際にAzureファイルストレージからのファイルダウンロードを例にとって、非同期処理の実践的な利用法も紹介しています。

Takeaways

  • 😀 非同期処理とは、処理の完了を待たずに別の処理を実行できること
  • 😊 入出力に時間のかかる処理で非同期処理を利用することが多い
  • 🤔 非同期処理は並列処理とは異なり、イベントループによって制御される
  • 😯 コルーチンは処理を中断し、後から再開できる関数
  • 😃 awaitでコルーチンを呼び出し、完了まで待つことができる
  • 🙂 create_taskでタスクを生成し、複数のコルーチンを並列実行できる
  • 🧐 gatherで複数のタスクやコルーチンをまとめて呼び出せる
  • 🤩 run_in_executorで普通の関数を非同期処理として扱える
  • 😮 wait_forでタイムアウトを設定し、処理を強制終了できる
  • 👍 Azure SDKのような非同期ライブラリも扱える

Q & A

  • 非同期処理とは何ですか?

    -非同期処理とは、処理の完了を待たずに別の処理を並行して走らせることです。I/Oバウンドな処理で時間がかかる場合に利用されます。

  • 非同期処理と並列処理はどう違うのですか?

    -非同期処理は並列処理を簡単に扱えるようにしたものです。イベントループがタスクを制御してくれるので、細かいことを気にせずに並列処理を記述できます。

  • コルーチンとは何ですか?

    -コルーチンとは、処理を途中で中断して後から再開できる関数のことです。非同期処理で利用されます。

  • なぜasyncioのsleepを使うのですか?

    -asyncioのsleepはコルーチンなので、非同期処理でawaitできます。時間モジュールのsleepはコルーチンではないのでエラーになります。

  • gatherはどういう場合に使いますか?

    -gatherは複数のコルーチンやタスクを平行実行し、それぞれの戻り値をまとめて受け取るために使います。平行処理結果を一度に取得したい時に利用します。

  • タスクとは何ですか?

    -タスクはコルーチンをラップしたもので、これを使うことでコルーチンを平行処理できます。create_taskでタスクを生成します。

  • 実際にファイルダウンロードで非同期処理を使うメリットは何ですか?

    -ダウンロード処理に時間がかかる場合、逐次処理だとプログラム全体がブロックされます。非同期処理を使えば他の処理を並行で走らせられるので効率的です。

  • 普通の関数を非同期処理で使うにはどうすればいいですか?

    -loop.run_in_executorで指定した関数を非同期処理で使えるようにラップできます。スレッドプールやプロセスプールも指定できます。

  • タイムアウトを設定するにはどうしたらいいですか?

    -asyncio.wait_forを使うと、指定した時間を超えたらタイムアウト例外を送出できます。長時間処理を強制終了させたい場合に利用します。

  • Windowsで実行する時の注意点は何ですか?

    -Windowsの場合はイベントループポリシーをWindowsSelectorEventLoopPolicyに設定する必要があるようです。バグ回避のためです。

Outlines

00:00

🐍 Pythonの非同期処理入門

佐藤は非同期処理の基本として、特定のライブラリ使用時に必要になるPythonのasync/awaitについて解説します。この動画は非同期処理を扱うフレームワークやライブラリの開発者ではなく、非同期処理を使えるようになることを目指すアプリケーション開発者向けです。非同期処理とは、処理の完了を待たずに別の処理を走らせることで、IOバウンドの操作で時間がかかる場合に有用です。非同期処理は並列処理や並行処理とは異なり、イベントループを使って非同期タスクを効率よく制御します。

05:03

🔧 非同期処理の基本コード例

async/await構文の基本的な使い方を説明し、非同期処理のコード例を示します。コルーチンを実行するためにはawaitキーワードを使い、処理の完了を待つことができます。非同期処理では、処理の完了を待ちつつ、別の処理も同時に行うことが可能です。この柔軟性により、例えば1秒と2秒のスリープを非同期で実行するコードを通じて、非同期処理の動作を確認します。また、関数から非同期処理を呼び出す際にも、その関数はコルーチンである必要があり、戻り値の扱い方についても説明します。

10:03

🚀 非同期処理の高度な使い方

非同期処理を平行処理で動かす方法として、タスクの作成とギャザー関数の使用を紹介します。タスクを作ることでコルーチンをラップし、平行処理を可能にします。また、ギャザーを使うことで複数のコルーチンやタスクを平行処理し、その結果を一度に受け取ることができます。さらに、非同期処理で普通の関数を扱いたい場合のrun_in_executorの使い方や、処理のタイムアウトを設定する方法についても解説します。これらの高度な機能を使いこなすことで、より複雑な非同期プログラムを効率良く実行することが可能になります。

15:04

🌐 実践!非同期ファイルダウンロード

実際のアプリケーション例として、Azureクラウドサービスからファイルを非同期でダウンロードする処理を紹介します。非同期対応のライブラリを使用することで、複数のファイルを同時にダウンロードすることが可能です。これにより、ファイルサイズが大きい場合でも効率的に処理を行うことができます。Windows環境での特別な設定にも触れ、非同期処理の実用例を通して、async/awaitの扱い方を深く理解することを目指します。

Mindmap

Keywords

💡非同期処理

処理の完了を待たずに別の処理を並行して走らせることができるプログラミングの手法です。ビデオではPythonでの非同期処理の実装方法とAsyncioモジュールの使い方が解説されています。

💡コルーチン

非同期処理で利用される関数です。処理の途中で中断でき、後から再開することができます。ビデオではコルーチンの定義方法と、Asyncioでの利用方法が解説されています。

💡イベントループ

非同期処理において、イベントの発生を監視し、タスクを制御する働きをします。ビデオではイベントループが非同期処理をいい感じに制御してくれると説明されています。

💡アウェイト

非同期処理において、コルーチンの実行を開始し、処理が完了するまで待つために使用します。ビデオではアウェイトの使い方が詳細に解説されています。

💡タスク

非同期処理における並列実行の単位です。クリエイトタスクでコルーチンをラップすることで生成できます。ビデオではタスクの作り方と利用方法が解説されています。

💡Gather

複数の非同期タスクを並列処理し、それぞれの戻り値をまとめて受け取ることができるAsyncioの機能です。ビデオではGatherの書き方と利用方法が解説されています。

💡ランインエグゼキューター

通常の関数を非同期処理として実行するために使用します。ビデオでは時間のかかる通常の関数を非同期処理化する例が示されています。

💡タイムアウト

非同期処理のタイムアウト時間を設定し、時間内に完了しない場合は処理をキャンセルすることができます。ビデオではタイムアウトの設定方法と利用シーンが紹介されています。

💡Azure

Microsoftのクラウドサービスです。ビデオ後半ではAzureのファイルサービスを使用したファイルダウンロードの非同期処理の例が紹介されています。

💡イベント駆動型

イベントの発生に応じて処理が実行されるプログラミングの形式です。ビデオでは非同期処理はイベント駆動型を実現する機能として説明されています。

Highlights

非同期処理とは、処理の完了を待たずに別の処理を並行して実行できる

非同期処理は入出力に時間のかかる処理でよく使われる

非同期処理はイベントループを使ってタスクを制御する

コルーチンは処理を途中で中断して後から再開できる

アウェイトでコルーチンを呼び出すと処理完了を待つことができる

タスクを使うとコルーチンを並列処理で実行できる

ギャザーで複数のコルーチンやタスクの結果をまとめて取得できる

ランインエグゼキューターで普通の関数を非同期処理で呼び出せる

ウェイトフォーでタイムアウトを設定して処理を強制終了できる

Azure SDKのファイルダウンロードが非同期対応なのでアウェイトで呼び出せる

Windowsではイベントループポリシーの設定が必要な場合がある

非同期ライブラリを扱う時はアウェイトで呼び出せるか確認する

コルーチンとアウェイトを使うことで並列処理が扱いやすくなる

タスクやギャザーを組み合わせることで複雑な並列処理が実装できる

非同期処理は平行性を上手く利用するための仕組みだと理解する

Transcripts

play00:00

こんにちはタイソンvtuberの佐藤

play00:02

です今回はPythonの非同期処理

play00:04

エンシングアウェイトについて解説したい

play00:06

と思いますエイシングアウェイトハイソン

play00:10

で使う頻度が多いとは言えませんが特定の

play00:13

ライブラリを使う時とかに必要になること

play00:15

があるのでこの機会にぜひ使い方を覚えて

play00:18

みてくださいこのチャンネルは

play00:19

Pythonに関する情報を発信している

play00:21

ので

play00:22

良ければチャンネル登録よろしくお願いし

play00:23

ますまたメンバーシップ会員しか見れない

play00:26

動画ライブもあるので

play00:28

良ければメンバーシップのご検討も

play00:29

よろしくお願いします

play00:31

まずはじめにこの動画の目的について

play00:34

あらかじめご説明しておきますこの動画は

play00:38

非同期処理を使ったフレームワークや

play00:40

ライブラリの開発者向けには作られてい

play00:42

ませんアプリケーション開発の中で

play00:46

非同期処理を扱ったフレームワーク

play00:48

ライブラリを使えるようになることを目的

play00:50

としたエンジニア向けに作ってるのでその

play00:52

点あらかじめご了承くださいでは

play00:55

非同期処理って何かってことなんですが

play00:58

非同期処理というのは

play00:59

処理の完了を待たずに別の処理を走らせる

play01:01

ことを言います一般的なPython

play01:04

コードは前の処理が完了したら次の処理が

play01:07

実行されますよねこういうのを逐次処理と

play01:10

言います

play01:11

一方非同期処理は

play01:13

処理の完了を待たずに別の処理を走らせる

play01:16

ことができるため普通のプログラムよりも

play01:19

複雑なことができますそして

play01:21

非同期処理を扱いたい時に使用するのが

play01:23

ACTAway投稿文ですじゃあどんな時

play01:26

に非同期処理を使うかっていうと

play01:29

処理が

play01:29

完了するまでに時間がかかるなーって時に

play01:32

非同期処理を使います特にPythonで

play01:34

play01:35

IOバウンドつまり入出力に関わる書類に

play01:37

おいて時間がかかるなって時に

play01:40

非同期処理を使うことが多いです例えば

play01:42

ファイルのダウンロードやアップロードや

play01:45

データベースの読み書きこういった処理で

play01:47

データ数やファイルサイズが大きいとこの

play01:51

処理時間がかかるんだよなーって時に

play01:52

Pythonでは非同期処理が使われる

play01:54

ことが多いですねここまでの話を聞いて

play01:57

処理の完了を待たずに別の処理を走らせる

play02:00

移動機処理ってそれ

play02:02

並列処理平行処理と同じなんじゃない何が

play02:05

違うんだと思った人もいるんじゃないのか

play02:07

なと思います

play02:08

並列処理並行処理については以前に動画を

play02:11

アップのねわからない方はぜひそちらを見

play02:13

てみてください実は

play02:15

非同期処理はそもそも平行処理や並列処理

play02:18

とは

play02:19

違うっていうわけじゃなくて平行処理と

play02:21

いうものを簡単に扱えるようにしたのが非

play02:24

同期処理だよっていうことです特に非同期

play02:27

処理ではイベントループっていうものが

play02:29

登場してこのイベントループが

play02:32

非同期のタスクをいい感じに制御してくれ

play02:34

ますなので私たちは細かいことを考えずに

play02:37

あこれは処理の完了を待たなくていいやつ

play02:40

ですあこっちは処理の完了を混ぜたやつ

play02:43

ですねって感じで簡単なコードで平行処理

play02:46

を扱うことができます言葉だけ説明してい

play02:49

てもいまいちイメージがつきにくいかなと

play02:51

思うので

play02:52

絶縁しながら非同期処理のコードの書き方

play02:54

を解説していきますねまたこれから先で

play02:57

解説するコードは

play02:59

iPhone3.7以上じゃないと動か

play03:00

ないので

play03:01

バージョンが低い方はPythonの

play03:03

バージョンアップをお願いします

play03:06

はじめに

play03:07

レーシングアウェイト構文を扱うための

play03:09

Python標準モジュールathing

play03:12

i/Oをインポートしますでこんなメイン

play03:15

関数があったとしますこの関数はこの

play03:18

スクリプトが実行されて一番初めに呼ば

play03:21

れる関数になりますそしてこのスクリプト

play03:24

の中で

play03:25

非同期処理を扱いたいのでこのメイン関数

play03:28

の定義の前にシンクってつけますいい

play03:32

シンクをつけた関数はコルーチンという

play03:34

ものになりますコルチとは

play03:37

処理をある場所で一次中断してまた途中

play03:40

から再開できるものを言います今この

play03:43

メインでは中断する部分はありませんね

play03:46

後ほど書いていきますそしてこの

play03:49

スクリプトを実行した時に動く

play03:52

ifネーム=メインの中でシンクIO

play03:56

Runmainっていう風に書いておき

play03:58

ます

play03:59

はイベントループが作られて引数に指定し

play04:03

たコルーチンが実行されます

play04:06

それではメインの中で

play04:08

完了までに時間がかかる処理を呼び出し

play04:10

たいと思いますまずコードがシンプルな方

play04:13

が分かりやすいと思うのでシンク

play04:16

IOのスリープを呼び出そうと思います

play04:18

スリープだとイメージがつきにくいかも

play04:20

しれませんがこの部分が何かしらの時間が

play04:24

かかる処理例えばファイルのダウンロード

play04:26

とかだと思ってください

play04:28

ちなみに

play04:29

普段スリープを使うときはタイム

play04:31

モジュールのスリーブを使ってると思うん

play04:33

ですが今回はAsyncioのスリップを

play04:37

使いますなぜかって言うとシンクIOの

play04:40

スリーブがコルチにだからですエディター

play04:43

でこのスリープの部分の定義にジャンプし

play04:47

てみると

play04:48

Fの前にエーシンクってついてるのでこの

play04:52

スリープがコルーチンであることがわかり

play04:55

ます

play04:57

タイムモジュールのスリープは普通の関数

play04:59

なのでそのままではエーシンクアウェイト

play05:02

構文で扱うことができないんですよねで

play05:04

スリープの引数にスリープさせたい秒数を

play05:08

渡します今回は1秒のスリープと2秒の

play05:12

スリープを1回ずつ実行しようと思います

play05:14

そして注意が必要なのはコルーチンはただ

play05:18

このように書いただけでは動きません

play05:20

コルチを実行するにはアウェイトを前に

play05:24

つけますこのうちにアウェイトをつけると

play05:26

フルーチンが実行されてその処理が終わる

play05:30

までここで待つことができます

play05:33

処理の完了待ってるなら普通の築地処理と

play05:36

同じじゃんって思うかもしれませんが

play05:39

非同期処理では

play05:40

処理の完了を待たずに別の処理もできるし

play05:43

ある処理においては

play05:45

完了待ってからさらに次の処理も進め

play05:47

るっていう

play05:48

柔軟なプログラムが作れます

play05:50

なので一旦処理の完了を待って次の処理を

play05:53

するっていうこの実装を動かしてみたいと

play05:56

思いますそしてアウェートの部分で

play05:58

ちゃんと待ってるかを確認するために

play06:00

タイムモジュールをインポートしてメイン

play06:03

の開始と終了のプリント文のところに現在

play06:06

の時間を表示させようと思いますこれを

play06:10

実行してみると

play06:16

処理時間の

play06:16

合計が3秒なのでアウェイトのところで

play06:19

処理の完了を待ってるのがわかりますね

play06:21

またコルーチンをアウェイトで呼び出して

play06:24

いる部分を関数に切り出そうと思った時

play06:27

その関数は青いと一時停止があるのでその

play06:31

関数もコルチにする必要がありますどう

play06:35

いうことかというと例えば1秒スリープ

play06:37

するこの部分を別の関数にこんな風に

play06:41

切り出したとします分かりやすいように

play06:44

Awayとする前に

play06:46

プリント分で何秒も使う表示させておき

play06:48

ます今これは普通の関数のように切り出し

play06:52

たのですがファンクション1はアウェイト

play06:54

が存在するのでFの前にシンクをつけて

play06:59

コルチにする必要がありますそしてこの

play07:02

ファンクション1はコルーチンなのでこの

play07:05

ままだとファンクション1は動きません

play07:08

なので前にアウェイトをつけてコルーチン

play07:11

が実行されるようにしますこれでスリープ

play07:14

を含む処理をゴルーチンとして切り出す

play07:16

ことができましたまた戻り値がある場合を

play07:19

考えてみますリターンで返した値は

play07:22

アウェイトの左側で通常と同じように

play07:25

イコールを使って変数に代入することが

play07:27

できます

play07:28

リターンで何秒の待機に成功しましたって

play07:32

文字列を書いてメイン側で受け取って表示

play07:35

をするという行動をかけました実際にこれ

play07:38

を実行してみると

play07:44

先ほどと同じように処理に3秒かかって

play07:48

処理の完了まで待っていることと戻り値が

play07:51

メイン側で受け取れることがわかります

play07:55

では次にコルーチンを平行処理で動かそう

play07:58

と思いますごルーチンを平行処理で動かす

play08:01

にはタスクというものを作る必要があり

play08:03

ます

play08:05

クリエイトタスクの中でコルチを呼び出す

play08:08

とオルーチンをラップしたタスクが作られ

play08:11

ますなので今回は1秒スリープする

play08:15

コルーチンをラップしたタスク1と2秒

play08:18

スリープするコルーチンをラップした

play08:20

タスクに2つのタスクを作りました

play08:23

アウェイトの右側にタスクを指定すること

play08:26

でそのタスクが実行できますそしてタスク

play08:29

は平行処理されるのでこのように書くと

play08:32

タスク1とタスクには同時に処理が走り

play08:36

ますこのコードを実行してみると

play08:43

今度は2秒で処理が完了したのがわかり

play08:46

ますつまりタスク1とタスク2が平行処理

play08:49

されたことが分かりますねまたこのタスク

play08:52

を使って戻り値を取得することもできます

play08:54

例えば先ほどと同じファンクション1と

play08:57

いうコルージンを作ってそのコルージン

play09:00

からラスク1とタスクにを作ります

play09:04

ウェイトでタスクを実行した後アメリカ

play09:07

から抜けたところでそれぞれのタスクの

play09:10

リターンを呼び出すと丸1を得ることが

play09:12

できますこのコードを実行してみると

play09:19

タスクが平行処理されてさらにメイン側で

play09:22

戻り値を取得することができましたね次に

play09:25

ギャザーというものを紹介しますこれは

play09:28

複数のクルーチンやタスクを平行処理する

play09:31

ことができてさらに平行処理で実行した

play09:34

それぞれの戻り値をまとめて受け取ること

play09:37

ができるものです書き方はアウェイトの

play09:40

後ろで真空IOをギャザーを呼び出して

play09:43

引数に平行を処理させたいタスクや

play09:47

コルーチンを指定すればOKです

play09:50

ブルーチンが指定された場合は内部で

play09:52

タスクにラップされますまたこの動画では

play09:55

紹介していませんがFutureっていう

play09:57

ものを指定することもできます

play09:59

フューチャーとは

play10:01

非同期処理の最終結果を表すものですが

play10:03

直接扱うことはほとんどないのでそんな

play10:06

ものがあるのかくらいの認識で大丈夫です

play10:08

こんな風にタスクもコルチも同時に引数に

play10:12

指定できますそして戻り値をリサルツと

play10:15

いう変数に代入してこれをプリント文で

play10:18

表示してみようと思いますこれを実行する

play10:21

play10:25

ユーザーの引数に指定したタスクと

play10:28

コルーチンが平行処理されて戻り値が

play10:31

リストの要素としてリザルツに格納された

play10:34

のがわかりますねここまでのコードは全て

play10:37

コルチにあるエーシンクIOのスリープを

play10:40

使っていましたでも普通の関数をどうして

play10:42

も深海王で扱いたいなという時があるかも

play10:45

しれませんそんな時は

play10:48

LANinエグゼキューターというものを

play10:49

使います

play10:51

エグゼキューターを使って普通の関数で

play10:54

あるタイムモジュールのスリープをシンク

play10:57

アウェイトの非同期処理で扱えるようにし

play10:59

てみます

play11:00

ちなみにファンクション1のスリープを

play11:02

タイムモジュールのスリープに変更して

play11:06

これで動かすと

play11:12

エラーになりますアウェイとタイム

play11:14

スリープのところでエラーになってるのが

play11:16

わかりますねアウェイトの後ろには普通の

play11:19

関数が指定できないからですなのでまず

play11:23

レーシングIOのGetランニングループ

play11:25

お呼び出して現在スレッドで動いている

play11:28

イベントループを取得しますで取得した

play11:31

そのイベントループのラン

play11:33

インエグゼキューターを呼び出します第一

play11:36

引数にはエグゼキューターを指定して第2

play11:38

引数には対象の関数を指定して第3引数に

play11:42

対象の関数に渡す引数を指定します第1

play11:46

引数に指定するエグゼキューターは

play11:48

並列処理の動画で解説したスレッドプール

play11:51

エグゼキューターやプロセスプール

play11:53

エグゼキューターを指定できますが特に

play11:55

指定がない場合は何にしておきますこの

play11:58

場合デフォルトのエグゼキューターが使わ

play12:00

れますこれでOKですもう一度この

play12:03

スクリプトを動かしてみると

play12:09

タイムモジュールのスリーブが

play12:12

並行処理されたのがわかりますねあとは

play12:14

タイムアウトで処理をキャンセルさせる

play12:16

こともできます例えばこの処理時間が

play12:20

かかると言っても10分経っても終わら

play12:22

ないならもうそれは途中で止めちゃいたい

play12:24

なーっていうことってありますよねその

play12:26

場合は

play12:28

thinkIOの

play12:29

ウェイト4を使って指定したタイムアウト

play12:31

時間を過ぎたら例外を投げるようにします

play12:34

トライの中でアウェイトの後ろに

play12:38

レーシングIOの

play12:39

ウェイト4を指定して内地引数に実行し

play12:42

たいコルジンを指定しタイムアウトの引数

play12:45

に何秒でタイムアウトさせるかを指定し

play12:48

ます

play12:49

今回は

play12:51

完了に10秒かかるコルーチンを指定して

play12:54

タイムアウトを3秒にしてみますもしも

play12:57

タイムアウトせずに処理が終わった時は

play13:00

ファンクション1の戻り値を表示させる

play13:03

ようにしておきますそしてタイムアウトし

play13:05

た場合はエイシンク

play13:07

IOをタイムアウトエラーという例外が

play13:09

発生するので

play13:11

xyptで例外を指定してタイムアウトを

play13:14

取って表示するようにしてみましたこれを

play13:16

実行してみると

play13:21

確かに3秒で処理が終わって戻り値が表示

play13:25

されずにタイムアウトしたのがわかります

play13:27

play13:30

ここまでの構文解説ではコードが読み

play13:33

やすいようにスリープを使っていたんです

play13:35

がいまいち実際にエーシンクアウェイトを

play13:38

使うコードのイメージがしにくいかなと

play13:40

思ったので最後に実際のファイル

play13:43

ダウンロードで

play13:44

非同期処理を動かしてみようと思います

play13:46

ファイルのダウンロードですが今回は

play13:48

AzureというMicrosoftの

play13:50

クラウドサービスのファイル共有サービス

play13:52

からファイルをダウンロードする処理を

play13:55

行うと思いますAzureのPython

play13:58

用のsdkはファイルのアップロードや

play14:01

ダウンロードの処理に

play14:03

非同期のものとそうでないもの両方が用意

play14:05

されています今回は

play14:08

非同期処理のものを使うと思いますまた

play14:10

AzureのPython用sdkの

play14:13

詳しい使い方は本題とはそれるので割愛し

play14:16

ますただコードの中のダウンロードの部分

play14:19

は今まで解説してきたシンクIOの

play14:22

スリーブと同じなのであウェイトで

play14:25

呼び出せるんだなこれはコルチーノだなっ

play14:28

ていう理解で大丈夫です

play14:30

そして今こんな風に3つのファイルが

play14:33

クラウド上にありますこのファイルを

play14:35

シンクアウェイとでダウンロードしたいと

play14:38

思いますまず先ほどと同じように深くIO

play14:42

とタイムをインポートしておいて

play14:44

Azureのファイル共有に接続するため

play14:47

のコネクション文字列もインポートして

play14:49

おきますあとはAzureのファイル共有

play14:52

用のクライアントモジュールもインポート

play14:53

しておきますそしてダウン

play14:57

ロードっていう関数を作ってシンクをデフ

play15:00

の前につけてコルチにしますこの中に

play15:03

先ほどのAzureのドキュメントに書い

play15:06

てあった通りにファイルダウンロードの

play15:08

コードを書いていきます今追加した部分は

play15:11

ファイル名とパスの指定以外は

play15:13

ドキュメントのコードと全く同じです

play15:16

そしてファイルクライアントのクローズを

play15:18

しますこれも黒字なのでハワイプをつけて

play15:21

くださいダウンロード対象のファイル名は

play15:24

引数ファイルで受け取るようにしました

play15:27

あとは開始のタイミングと終了ので

play15:30

プリント文を使って時間を出力させておき

play15:33

ますそしてメイン関数のAシンクをつけて

play15:36

くるうちにしてこの中でasyncIOの

play15:40

ギャザーを使って3つのファイルの

play15:42

ダウンロードを呼び出しますこれを実行し

play15:44

たいのですがここでWindowsの人

play15:46

だけに注意がありますどうやら使っている

play15:49

ライブラリーのバグによってこのような

play15:51

コードを入れる必要があります

play15:54

プラットフォームのシステムが

play15:55

Windowsの時にエーシンクIOの

play15:58

Setイベント

play16:00

ループポリシーを呼び出して

play16:01

引数に

play16:03

英進会をWindowsセレクター

play16:05

イベントループポリシーを指定して

play16:07

ください

play16:08

これを実行してみると

play16:11

3つのファイルのダウンロードが一斉に

play16:14

始まったのがわかりますねおそらく一番

play16:17

ファイルサイズの小さいビッグファイル3

play16:19

っていうファイルからダウンロードが完了

play16:21

すると思います

play16:26

これで全部終わったみたいですねこんな風

play16:28

play16:29

非同期対応のライブラリを扱う必要がある

play16:31

時でもこの動画で紹介したエーシンク

play16:33

アウェイトの扱い方がわかれば適切に扱う

play16:36

ことができますね

play16:38

今回の動画は以上になりますそれではまた

play16:41

次回の動画でお会いしましょうバイバイ

play16:47

[音楽]

Rate This

5.0 / 5 (0 votes)

Do you need a summary in English?