Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】threadingモジュールでバックグラウンド処理を実現する方法

はじめに

このチュートリアルでは、Pythonにおけるマルチスレッド処理について解説します。マルチスレッドを活用すると、複数のタスクを同時に実行できるようになります。Pythonには、このようなマルチタスクを実現するためのthreadingモジュールが標準ライブラリとして用意されています。

ここでは、「リスト内の数値の合計を計算しながら、裏側でファイルにデータを書き込む」という具体例を通して、マルチスレッドの動作を確認していきましょう。プログラム全体の流れは以下のステップになります。

  • threadingモジュールをインポートする

  • threading.Threadクラスを継承した独自クラスを作成する

  • 作成したクラスのrunメソッド内に、ファイルへの書き込み処理を記述する

  • 必要なデータ(メッセージやファイル名)を初期化する

  • リスト内の数値の合計を計算するコードを記述する

サンプルコード

# モジュールのインポート
import threading

# threading.Thread基底クラスを継承したクラスを作成
class MultiTask(threading.Thread):
    def __init__(self, message, filename):
        # 基底クラスのコンストラクタを呼び出す
        threading.Thread.__init__(self)
        # 変数をインスタンス属性として初期化
        self.message = message
        self.filename = filename

    # バックグラウンドで実行されるrunメソッド
    def run(self):
        # ファイルを書き込みモードで開く
        with open(self.filename, 'w+') as file:
            file.write(self.message)
        print("Finished writing to a file in background")

# メイン処理
if __name__ == '__main__':
    # 変数の初期化
    message = "We're from Tutorialspoint"
    filename = "tutorialspoint.txt"

    # バックグラウンド書き込み用にクラスをインスタンス化
    file_write = MultiTask(message, filename)

    # バックグラウンドタスクを開始
    file_write.start()

    # もう一つのタスク(上記タスクと並行して実行される)
    print("It will run parallelly to the above task")
    nums = [1, 2, 3, 4, 5]
    print(f"Sum of numbers 1-5: {sum(nums)}")

    # バックグラウンドタスクの完了を待機
    file_write.join()

ポイントは、runメソッド内ではコンストラクタで受け取った値をself.messageself.filenameのようにインスタンス属性として参照することです。これにより、スレッド内でも正しく変数へアクセスできます。

実行結果

上記のコードを実行すると、以下のような出力が得られます。また、実行後にはカレントディレクトリに「tutorialspoint.txt」ファイルが生成されていることを確認してください。

It will run parallelly to the above task
Sum of numbers 1-5: 15
Finished writing to a file in background

出力を見ると、メインスレッド側の「合計の計算」が先に実行され、その後でバックグラウンドの「ファイル書き込み完了」メッセージが表示されています。これは、start()メソッドによって別スレッドが起動し、メインスレッドの処理と並行してrunメソッドが動作しているためです。最後のjoin()メソッドは、バックグラウンドのスレッドが完全に終了するまでメインスレッドを待機させる役割を担います。

まとめ

Pythonのthreadingモジュールを使えば、Threadクラスを継承してrunメソッドをオーバーライドするだけで、手軽にバックグラウンド処理を実装できます。時間のかかるI/O処理(ファイル書き込みなど)を別スレッドに任せることで、プログラム全体の効率を高められます。本チュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。

  1. Pythonでファイル選択ダイアログを表示し、テキストファイルを読み込む方法【Tkinter】

    Tkinterのfiledialogモジュールとは Pythonアプリケーションでダイアログボックスがどのように動作しているのか、疑問に思ったことはありませんか? その答えとなるのが、Tkinterに標準で用意されているfiledialogモジュールです。このモジュールには、システム上のファイルを扱うための各種ダイアログを表示できる組み込み関数が多数含まれています。 中でもよく使われるのがfiledialog.askopenfilename()です。この関数を呼び出すと、ユーザーはシステム内のファイルをブラウズして選択できるようになります。選択されたファイルの種類に応じて、スクリプト側で読み込

  2. PythonのopenpyxlでExcelファイルを読み書きする方法を徹底解説

    はじめにopenpyxlは、Excel 2010形式のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。Office Open XML形式をPythonからネイティブに扱えるライブラリが存在しなかったことから、その不足を補うために誕生しました。業務などで使用するExcelファイルは「ワークブック(Workbook)」と呼ばれ、最低1枚、最大で数十枚のシートを含むことができます。各シートは、行が1から始まり、列がAから始まる構成になっています。openpyxlライブラリを使えば、シートの追加やデータの入力はもちろん、データの操作や削除まで、さまざま