Pythonでマルチスレッドを活用した並列処理の効率化

python
記事内に広告が含まれています。

Pythonマルチスレッドを活用することで、複数の処理を並行して実行し、プログラムのパフォーマンスを向上させることが可能です。

この記事では、Pythonのマルチスレッドの基本的な使い方から、効率的な活用方法までを解説します。

DMM WEBCAMP
  • 未経験者向けプログラミングスクール
  • 現役エンジニアがしっかりサポート
  • 卒業後も安心の転職・副業サポート

Pythonでのマルチスレッドの基本

Pythonでマルチスレッドを利用することで、複数のタスクを同時に実行できます。

マルチスレッドは、特にI/O操作やネットワーク通信など、待機時間の長い処理を効率化する際に役立ちます。

threadingモジュールの基本的な使い方

Pythonでマルチスレッドを実現するには、標準ライブラリのthreadingモジュールを使用します。


    import threading

    def print_numbers():
        for i in range(5):
            print(i)

    # スレッドの作成
    thread = threading.Thread(target=print_numbers)
    thread.start()
    thread.join()  # スレッドの終了を待機
    

このコードでは、threading.Threadを使って新しいスレッドを作成し、joinでスレッドの終了を待機しています。

複数スレッドを同時に実行する

複数のスレッドを同時に実行することで、複数のタスクを並行して処理できます。

次のコードでは、2つのスレッドを作成して、それぞれ別々のタスクを並行して実行します。


    import threading

    def task1():
        print("Task 1")

    def task2():
        print("Task 2")

    thread1 = threading.Thread(target=task1)
    thread2 = threading.Thread(target=task2)

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()
    

この例では、2つのスレッドが同時に実行され、それぞれのタスクが並行して処理されます。

スレッドの同期とロック

マルチスレッドを使う際に重要なことは、複数のスレッドが同じリソースにアクセスする場合の同期です。

Pythonでは、Lockオブジェクトを使ってスレッド間での競合を防ぎます。


    import threading

    lock = threading.Lock()
    counter = 0

    def increment():
        global counter
        with lock:  # ロックを取得して同期
            counter += 1

    threads = []
    for i in range(5):
        thread = threading.Thread(target=increment)
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    print(counter)
    

このコードでは、withステートメントを使ってlockを取得し、counterの値を安全にインクリメントしています。

CodeCamp
  • 現役エンジニアからスキルを学べる
  • 満足度は驚異の97.4%
  • 300社以上のIT企業で研修に導入
  • 毎日9時〜21時まで、無料カウンセリングを開催中!

Pythonでのマルチプロセッシングとマルチスレッディングの違い

Pythonでは、マルチプロセッシングマルチスレッディングの2つの並行処理方法があります。

ここでは、それぞれの違いと、適切な選択方法について解説します。

マルチスレッドの利点と欠点

マルチスレッドは、メモリ共有が容易で、スレッド間でのデータ通信が簡単に行えます。

しかし、PythonのGIL(グローバルインタプリタロック)により、CPUバウンドなタスクの並列処理には適していません。


    import threading

    def cpu_bound_task():
        total = 0
        for i in range(10000000):
            total += i
        print(total)

    thread1 = threading.Thread(target=cpu_bound_task)
    thread2 = threading.Thread(target=cpu_bound_task)

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()
    

このコードでは、GILの影響で、スレッドの数が増えてもCPUバウンドタスクの効率は向上しません。

マルチプロセッシングの利点

マルチプロセッシングは、GILの制約を受けないため、CPUバウンドなタスクにはマルチスレッドよりも効果的です。

Pythonでは、multiprocessingモジュールを使用してプロセス間での並行処理を実現できます。


    import multiprocessing

    def cpu_bound_task():
        total = 0
        for i in range(10000000):
            total += i
        print(total)

    process1 = multiprocessing.Process(target=cpu_bound_task)
    process2 = multiprocessing.Process(target=cpu_bound_task)

    process1.start()
    process2.start()

    process1.join()
    process2.join()
    

この例では、multiprocessingを使ってCPUバウンドタスクを並列に実行しています。

使い分けのポイント

I/Oバウンドタスクにはマルチスレッドを、CPUバウンドタスクにはマルチプロセッシングを選択することが推奨されます。

【リモートワークには必須】
キャリアに合わせてお得に光回線を利用しよう
ドコモ光
開通後、最短一ヶ月で35,000円のキャッシュバック!
 
auひかり
難しい条件一切なしで、最大12,7000円のキャッシュバック!
 
ソフトバンク光
高額キャッシュバックや豪華特典をお届け!

Pythonのスレッドプールを使った効率的な並列処理

programming

Pythonのスレッドプールを使用することで、複数のスレッドを効率的に管理し、並列処理を最適化できます。

ここでは、ThreadPoolExecutorを使ったスレッドプールの活用方法を解説します。

ThreadPoolExecutorの基本的な使い方

concurrent.futuresモジュールのThreadPoolExecutorを使うことで、簡単にスレッドプールを作成し、タスクを並列に処理できます


    from concurrent.futures import ThreadPoolExecutor

    def task(message):
        print(message)

    with ThreadPoolExecutor(max_workers=3) as executor:
        executor.submit(task, "Task 1")
        executor.submit(task, "Task 2")
        executor.submit(task, "Task 3")
    

このコードでは、3つのタスクがスレッドプールによって並行して実行されます。

スレッドプールによるリソースの最適化

スレッドプールを使用することで、スレッドの生成と破棄によるオーバーヘッドを抑え、効率的にリソースを管理できます。

タスクの結果を取得する

submitメソッドを使ってスレッドプールでタスクを実行した場合、その結果をfutureオブジェクトで取得することができます。


    from concurrent.futures import ThreadPoolExecutor

    def task(n):
        return n * n

    with ThreadPoolExecutor() as executor:
        future = executor.submit(task, 5)
        result = future.result()
        print(result)
    

この例では、タスクの結果をfuture.result()で取得しています。

プログラミングスクール受講時には教育訓練給付制度を利用することで、受講料の最大80%の給付を受けることが可能です。

まとめ:Pythonでマルチスレッドを効率的に活用しよう

Pythonのマルチスレッドを適切に活用することで、プログラムのパフォーマンスを向上させ、並列処理を効率的に行うことができます。

この記事で紹介した方法を参考にして、Pythonでのマルチスレッドプログラミングを活用しましょう。

【給付金が受けられる】おすすめプログラミングスクール!
  • DMM WEBCAMP
    転職成功率98%&離職率2.3%
    転職できなければ全額返金DMM.comグループならで非公開求人も多数
  • テックアカデミー
    【転職保証】受講生の100%が内定獲得!9割以上が未経験からスタート!LINEヤフー監修&万全サポート
  • Aidemy Premium
    【給付金利用の相談歓迎】AI・データ分析学ぶならAidemy Premium
  • ウズウズカレッジ
    初心者・文系出身者でもOK、IT未経験からの専門的な就業サポート

コメント

タイトルとURLをコピーしました