Python マルチスレッドの同期メカニズム

with cond: は、Python でスレッドを同期する方法です。

マルチスレッド同時プログラミングでは、複数のスレッドがデータまたはリソースを共有する必要がある場合、競合状態が発生してデータの問題が発生しやすくなります。この状況を回避するために、ロック (Lock)、条件変数 (Condition)、セマフォ (Semaphore) およびその他のメカニズムを使用して、データの同期を確保できます。
その中でも、条件変数は非常によく使用される同期メカニズムです。これにより、スレッドは特定の条件が満たされた場合にのみ動作することができ、それ以外の場合は永久に待機することになります。

具体的には、スレッドが条件変数の wait() メソッドを呼び出すと、スレッドは現在保持されているロックを解放し、別のスレッドが条件変数の Notice() メソッドまたは Notify_all() メソッドを呼び出してウェイクアップするまで待機状態に入ります。
以下は、条件変数を使用してスレッド同期を実現する方法を示す簡単な例です。

import threading


data = []
cond = threading.Condition()


class ProducerThread(threading.Thread):
    def run(self):
        global data
        for i in range(10):
            with cond:
                data.append(i)
                print(f"生产者线程: {i}")
                cond.notify()  # 唤醒阻塞的消费者线程
            self._sleep()

    def _sleep(self):
        import time
        time.sleep(1)


class ConsumerThread(threading.Thread):
    def run(self):
        global data
        while True:
            with cond:
                if not data:
                    cond.wait()  # 如果data为空,则阻塞线程
                print(f"消费者线程: {data.pop(0)}")
            self._sleep()

    def _sleep(self):
        import time
        time.sleep(1)


# 启动生产者线程和消费者线程
producer = ProducerThread()
consumer = ConsumerThread()
producer.start()
consumer.start()

この例では、データ リストを定義し、2 つのスレッド、ProducerThread と ConsumerThread がそれぞれそれに対して動作します。

ProducerThread がデータ リストに要素を追加すると、条件変数の Notice() メソッドを呼び出して、待機中の ConsumerThread スレッドを起動します。

ConsumerThread は、データ リストが空であることを検出すると、条件変数の wait() メソッドを呼び出して自身をブロックし、ロックを解放し、他のスレッドが notify() メソッドを呼び出してウェイクアップするのを待ちます。
条件変数を使用する場合、最初にロックを取得し、最後にロックを解放する必要があることに注意してください。

したがって、このプロセスを簡素化するために、 with cond: の糖衣構文がよく使用されます。

おすすめ

転載: blog.csdn.net/qq_41579327/article/details/131661661
おすすめ