Python の同時実行性: マルチプロセッシングとマルチスレッド

マルチプログレス

公式文書

マルチスレッド化

Python のマルチスレッドは主にスレッドモジュールを通じて実装されます。

このモジュールは、複数のスレッド (軽量プロセスまたはタスクとも呼ばれる) を操作するための低レベルのプリミティブを提供します。つまり、グローバル データ スペースを共有する制御の複数のスレッドです。同期の問題を処理するために、単純なロック メカニズム (ミューテックスまたはバイナリ セマフォとも呼ばれる) も提供されています。スレッディングモジュールは、このモジュールに基づいた、より使いやすい高レベルのマルチスレッド API を提供します。

マルチスレッドの例

Python で複数のスレッドを作成して実行します。

import threading

# 定义要执行的线程任务函数
def task():
    print("Thread is running")

# 创建线程对象
thread = threading.Thread(target=task)

# 启动线程
thread.start()

# 等待线程结束
thread.join()

print("Thread execution completed")

この例では、まず、実行時にメッセージを出力する task というスレッド タスク関数を定義します。次に、threading.Thread クラスを使用してスレッド オブジェクトを作成し、ターゲットとしてタスク関数をスレッド オブジェクトに渡しました。次に、スレッド オブジェクトの start メソッドを呼び出してスレッドを開始します。最後に、join メソッドを使用して、スレッドの実行が完了するのを待ちます。
実際には、複数のスレッド オブジェクトを作成し、それらのタスクを同時に実行できます。同時に、スレッドの安全性を確保するために、スレッド間のデータ共有と同期メカニズムに注意してください。Python のマルチスレッドはスレッド切り替えに基づいており、特に時間のかかるCPU 集中型のタスク
には適していないことに注意してください。これは、Python のグローバル インタープリタ ロック (GIL) が複数のスレッドの並列実行を制限するためです。CPU を集中的に使用するタスクを処理する必要がある場合、または同時パフォーマンスを向上させる必要がある場合は、マルチプロセッシング モジュールを使用してマルチプロセスの並列処理を実現することを検討できます。

ロック機構

Python では、マルチスレッドの相互排他と同期を実現するために、threading.Lock オブジェクトを使用してミューテックスを作成できます。ミューテックス ロックにより、常に 1 つのスレッドだけが重要なリソースにアクセスできるようになり、競合状態やデータの不整合が回避されます。以下は、ミューテックスを使用して複数のスレッドの相互排他と同期を実装する方法を示す例です。


import threading
# 创建互斥锁对象

lock = threading.Lock()
counter = 0

def increment():
    global counter
    for _ in range(100000):
        # 获取互斥锁
        lock.acquire()
        counter += 1
        # 释放互斥锁
        lock.release()


# 创建多个线程并执行任务
threads = []
for _ in range(5):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

# 等待所有线程执行完毕
for t in threads:
    t.join()

# 打印计数器的值
print("Counter:", counter)

この例では、ミューテックス オブジェクト ロックを作成し、グローバル カウンター counter を定義します。次に、ループ内で毎回カウンターをインクリメントするインクリメント関数をスレッドのタスクとして作成しました。各インクリメントの前に、スレッドはミューテックスを取得して、1 つのスレッドだけがカウンターの値にアクセスして変更できることを確認してから、ミューテックスを解放します。

複数のスレッド オブジェクトを作成した後、これらのスレッドを開始し、join メソッドを使用して実行が完了するのを待ちます。最後に、カウンターの値を出力して、ミューテックスと同期が適切に機能していることを確認します。

ミューテックスを使用することで、スレッドが共有リソースに排他的にアクセスできるようになり、データの競合や不整合が防止されます。これにより、複数のスレッドの安全な実行が保証され、同期メカニズムが提供されます。

おすすめ

転載: blog.csdn.net/m0_51312071/article/details/132381326