Python

【Python】並行処理を行う方法を解説

この記事では、Pythonで並行処理を行う方法を解説します。

並行処理とは、複数の処理を高速で切り替えて実行することで同時に処理しているかのように見せる処理方法です。

並行処理を行うことで複数の処理を並行して行うことができます。何かしらの処理を行なっているときに同時に処理したいことがある場合に使用されます。

それでは、並行処理の方法を見ていきましょう!

並行処理のしかた

Python で並行処理を行うには 以下のようにします。

  1. threadingモジュール の Threadクラス を継承したクラスを定義
  2. runメソッド に処理を定義
  3. インスタンス化して startメソッド を実行する

threadingモジュール の Threadクラス を継承したクラスを定義

import threading

class MyThread(threading.Thread):
    pass

runメソッド に処理を定義

import threading

class MyThread(threading.Thread):

    def run(self):
        # スレッドで行わせたい処理

インスタンス化して startメソッド を実行する

import threading

class MyThread(threading.Thread):

    def run(self):
        # スレッドで行わせたい処理

subthread = MyThread()
subthread.start()

これで runメソッドに記述した処理が並行処理されます。

サンプル

以下のコードでは、メインスレッドで1秒間隔で現在時刻(分と秒のみ)を出力し、サブスレッドで2秒間隔で出力しています。

import threading
from datetime import datetime as dt
import time

class MyThread(threading.Thread):

    def run(self):
        count = 0
        for _ in range(3):
            count += 1
            time.sleep(2)
            print(f'サブスレッド {count}回目:  {dt.now().minute}分{dt.now().second}秒')

        print('サブスレッド終了!')


subthread = MyThread()
subthread.start()

count = 0

for _ in range(3):
    count += 1
    time.sleep(1)
    print(f'メインスレッド {count}回目:  {dt.now().minute}分{dt.now().second}秒')

print('メインスレッド終了!')

実行結果

メインスレッド 1回目:  45分20秒
サブスレッド 1回目:  45分21秒
メインスレッド 2回目:  45分21秒
メインスレッド 3回目:  45分22秒
メインスレッド終了!
サブスレッド 2回目:  45分23秒
サブスレッド 3回目:  45分25秒
サブスレッド終了!

スレッドが終わるまで待つ

スレッドの join()メソッド を呼び出すことで そのスレッドが終わるまで待つことができます。

import threading
from datetime import datetime as dt
import time

class MyThread(threading.Thread):

    def run(self):
        count = 0
        for _ in range(3):
            count += 1
            time.sleep(2)
            print(f'サブスレッド {count}回目:  {dt.now().minute}分{dt.now().second}秒')

        print('サブスレッド終了!')


subthread = MyThread()
subthread.start()

# サブスレッドが終わるまで待つ
subthread.join()

count = 0

for _ in range(3):
    count += 1
    time.sleep(1)
    print(f'メインスレッド {count}回目:  {dt.now().minute}分{dt.now().second}秒')

print('メインスレッド終了!')

実行結果

サブスレッド 1回目:  3分32秒
サブスレッド 2回目:  3分34秒
サブスレッド 3回目:  3分36秒
サブスレッド終了!
メインスレッド 1回目:  3分37秒
メインスレッド 2回目:  3分38秒
メインスレッド 3回目:  3分39秒
メインスレッド終了!

サブスレッドの計算結果を他のスレッドで使用したい場合などに使います。

まとめ

この記事では、Python の並行処理について解説しました。

並行処理は I/Oバウンド(ファイルの読み書きなど) を高速化することができます。高速化については以下の記事が参考になります。

参考【Pythonで高速化】I / Oバウンドとか並列処理とかマルチプロセスとかってなんぞや - Qiita

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

『DMM WEBCAMP COMMIT』