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

Pythonでマルチスレッドを使ってバックグラウンドでファイルに書き込む方法

はじめに

ここでは、1つのプログラム内で2つのタスクを同時に実行する方法を紹介します。具体的には、バックグラウンドではファイルへの書き込みを行い、フォアグラウンドではユーザーが入力した数値の奇数・偶数判定を実行します。

このように複数の処理を並行して行うには、Pythonのマルチスレッド機能を利用します。threadingモジュールを使えば、時間のかかるファイル操作などを別スレッドに任せ、メインの処理を止めることなくプログラムを継続できます。

サンプルコード

以下のコードでは、threading.Threadクラスを継承したAsyncWriteクラスを作成し、ファイルへの書き込み処理を非同期で実行しています。

import threading
import time

class AsyncWrite(threading.Thread):
    def __init__(self, text, out):
        threading.Thread.__init__(self)
        self.text = text
        self.out = out

    def run(self):
        f = open(self.out, "a")
        f.write(self.text + '\n')
        f.close()
        time.sleep(3)
        print("Finished Background file write to " + self.out)

def Main():
    message = input("Enter a string to store:")
    background = AsyncWrite(message, 'out.txt')
    background.start()
    print("The program can continue while it writes in another thread")

    num = int(input("Entered number is : "))
    if (num % 2 == 0):
        print("Entered number is Even")
    else:
        print("Entered number is ODD")

    background.join()
    print("Waited until thread was complete")

if __name__ == '__main__':
    Main()

コードのポイント

1. Threadクラスの継承

threading.Threadを継承したクラスを作成し、コンストラクタ__init__で書き込むテキストと出力先ファイル名を受け取ります。

2. run()メソッドで処理を定義

スレッドが開始されると自動的に呼び出されるのがrun()メソッドです。ここでは、指定されたファイルを追記モード("a")で開き、文字列を書き込んだ後、time.sleep(3)で3秒待機して完了メッセージを表示します。

3. start()でスレッドを起動

background.start()を呼び出すことで、別スレッドでのファイル書き込みが開始されます。これにより、書き込み中もメインスレッドは次の処理(数値の入力と奇偶判定)を続けられます。

4. join()でスレッドの完了を待機

background.join()により、バックグラウンドスレッドが終了するまでメインスレッドは待機します。これにより、すべての処理が確実に完了してからプログラムが終了します。

実行結果

Enter a string to store:Tutorialspoint
The program can continue while it writes in another thread
Entered number is : 33
Entered number is ODD
Finished Background file write to out.txt
Waited until thread was complete

まとめ

この例のように、マルチスレッドを活用すると、時間のかかるI/O処理(ファイル書き込みなど)をバックグラウンドに回しながら、メインスレッドでユーザーとの対話処理を続けることができます。ただし、実際の開発ではファイルアクセスの競合やGIL(Global Interpreter Lock)の影響にも注意が必要です。適切にjoin()を使用してスレッドの終了を管理することで、安全で効率的な並行処理が実現できます。

  1. Pythonで二分木の直径を求める方法【DFSを使った実装解説】

    二分木の直径とは二分木が与えられたとき、その木の直径(diameter)を計算することを考えます。二分木の直径とは、木の中の任意の2つのノードをつなぐ最長経路の長さのことです。重要なポイントとして、この経路は必ずしも根(ルート)を通るとは限りません。例えば、次のような木を考えてみましょう。この場合、経路 [4, 2, 1, 3] または [5, 2, 1, 3] の長さが3本の辺で構成されているため、直径は3となります。解法のアプローチこの問題はDFS(深さ優先探索)を使うことで効率的に解くことができます。手順は以下の通りです。DFSで各ノードを訪問しながら直径を求めます。まず答えを格納する変

  2. Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説

    本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(