2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【非同期処理】async await ← 理解しよう

Posted at

この記事について

この記事はこんな人におすすめです!

  • 非同期処理についてあまり知らない人
  • 初心者の人
  • なんとなく使っていて、意味まで分からない人

1.非同期処理って?

まず、非同期処理について少し知っておきましょう。
では、皆さんが今行っていることってどのくらいありますか?

  • 呼吸をする
  • 体温を維持する
  • 心臓を動かす

結構ありますね。これら全て同時に行っていることじゃないですか?
この同時に行うこと非同期処理と言います。

2.普通にプログラムを書いてみよう

まずはこのプログラムを見てください。

普通のプログラム
import time

def do_kanji_homework():
    print('Starting Kanji homework')
    time.sleep(4)                       # 漢字をする
    print('Kanji homework done')

def do_math_homework():
    print('Starting Math homework')
    time.sleep(2)                       # 算数をする
    print('Math homework done')

def main():
    do_kanji_homework()
    do_math_homework()

main()

このプログラムは、漢字と算数の宿題をするプログラムです。
このプログラムを実行するとこうなります。

Starting Kanji homework
# 4秒後
Kanji homework done
Starting Math homework
# 2秒後
Math homework done

これでは、1度に1つしか宿題ができません。これでは非効率です!
1度に2つの宿題が出来たら、その分時間がかかりません。
ということで、asyncとawaitの出番です!

3.同時に宿題をしよう

早速、asyncとawaitを使ってみましょう。
後でちゃんと意味は解説するので、安心してください。

非同期処理を使ったプログラム
import asyncio

async def do_kanji_homework():
    print('Starting Kanji homework')
    await asyncio.sleep(4)
    print('Kanji homework done')

async def do_math_homework():
    print('Starting Math homework')
    await asyncio.sleep(2)
    print('Math homework done')

async def main():
    await asyncio.gather(
        do_kanji_homework(),
        do_math_homework()
    )

asyncio.run(main())

色々増えましたが、これを実行すると...

Starting Kanji homework
Starting Math homework
# 2秒後
Math homework done
# さらに2秒後
Kanji homework done

なんと宿題を2つ同時に開始し、4秒で全て終わらせることができました!

4.解説

asyncio

非同期処理をするためのライブラリです。

asyncio.sleep

time.sleep()の非同期バージョンだと思ってください。

asyncio.gather

非同期関数を同時に開始する。
さっきの例だと、do_kanji_homeworkdo_math_homework
同時に開始しています。

asyncio.run

main関数を実行するための物。

asyncとawait

async

非同期関数の頭につける物。
漢字、算数の宿題をする関数とmain関数に使われている。

await

非同期関数の中で非同期にしたい物の頭につける。
漢字、算数の宿題ならasyncio.sleepに、
mainならasyncio.gather

おわり

非同期処理やasync、awaitについての理解は深まりましたか?
非同期処理はプログラムの中でも重要なもので、
覚えておくととても便利です。
この記事を読んでも分からなかったなら、
実際に記事に書かれていたコードを実行してみたり、
自分なりに変えてみたりすると意味が分かるかもしれません。

最後まで読んでいただきありがとうございます。
コメント、いいねしてくれると励みになります:cheese::cake:

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?