Pythonの同期処理と非同期処理について現役エンジニアが解説【初心者向け】

初心者向けにPythonの同期処理と非同期処理について現役エンジニアが解説しています。同期処理とは順番に実行していく処理で、非同期処理とは並行して実行する処理のことです。Pythonにおける同期処理と非同期処理の書き方や使い方について比較しながら解説します。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

Pythonの同期処理と非同期処理について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。

 

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。

 

田島悠介

今回は、Pythonに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Pythonの同期処理と非同期処理について詳しく説明していくね!

大石ゆかり

お願いします!

 

目次

 

同期処理とは

同期処理とは、プログラムにおいて、ある一つのタスクを実行中に他のタスクを実行したとき、先に実行中だったタスクの処理が中断する処理です。

たとえば、メインの実行文の中に特定の処理を行う関数が実行されている間は、メインの実行文の処理は中断されて関数の実行が終了したら再開する仕組みです。

図にすると、以下のようになります。

[PR] Pythonで挫折しない学習方法を動画で公開中

非同期処理とは

同期処理の一方で非同期処理はある一つのタスクを実行している傍らで、別のタスクを並行して実行する処理のことをいいます。

非同期処理を行なうことで時間のかかる処理や複数のタスクを同時進行で行なうときにつかうと全体の処理時間の短縮に繋がります。

こちらを図にすると以下の処理になります。

同期処理と非同期処理を比較してみよう

同期処理と非同期処理について、ここまで紹介してきましたが今度はPythonを例に同期処理と非同期処理の違いをサンプルコードで比較してみます。

今回は指定した引数の間sleepを実行するシンプルな関数を取り入れたサンプルです。

まずは、同期処理を行う例を見てみます。

import time

def waiting(sec):
    print("======{}sec Waiting Start ========".format(sec))
    time.sleep(sec)
    print("======{}sec Waiting Finish========".format(sec))

if __name__ == "__main__":
    waiting(3)
    waiting(2)
    waiting(1)

こちらのサンプルを実行すると、以下の結果が出力されます。

======3sec Waiting Start ========
======3sec Waiting Finish========
======2sec Waiting Start ========
======2sec Waiting Finish========
======1sec Waiting Start ========
======1sec Waiting Finish========

関数を上から順番に実行されるので、一つの処理が終わった瞬間に次の処理が実行されるようになります。

続いて非同期処理を行う場合はどうなるのかを見ていきましょう。

Pythonで非同期処理を行なう際にはasyncioを使います。先程のサンプルをasyncioを使って非同期処理にしてみます。asyncioはPythonの標準モジュールです。

import asyncio

async def waiting(sec):
    print("======{}sec Waiting Start ========".format(sec))
    await asyncio.sleep(sec)
    print("======{}sec Waiting Finish========".format(sec))

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    gather = asyncio.gather(
        waiting(3),
        waiting(2),
        waiting(1)
    )
    loop.run_until_complete(gather)

サンプルの中身は先程の同期処理から変わっていますが、関数の実行内容は全く同じで引数で指定した時間sleepさせる関数です。

実行結果は以下のようになると思います。

======1sec Waiting Start ========
======3sec Waiting Start ========
======2sec Waiting Start ========
======1sec Waiting Finish========
======2sec Waiting Finish========
======3sec Waiting Finish========

先程の実行結果と違って、複数の処理が同時にスタートするので、処理が並列されて終わるタイミングはsleepが終えたときの時間と一致します。

まとめ

今回はPythonでの同期処理と非同期処理についてまとめました。

通常のプログラムであれば基本的には同期処理を行っていますが、非同期処理を行えば処理の時間が短縮されて便利ですので設計するときに参考にしていただければと思います。

監修してくれたメンター

メンター三浦

モバイルゲームを運用している会社のエンジニアをしています。趣味でWEB開発やクラウドコンピューティングもやっており、ソフトもハードもなんでもやります。

TechAcademyジュニアではPythonロボティクスコースを担当しています。好きな言語はPython, Node.js。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、Pythonを使った人工知能(AI)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。