📜  使用注释休眠多对多示例(1)

📅  最后修改于: 2023-12-03 15:06:57.542000             🧑  作者: Mango

使用注释休眠多对多示例

在多线程编程中,可能需要让多个线程等待某个条件满足后同时执行。这个时候可以使用注释休眠的方法实现多对多的等待/唤醒操作。

示例说明

本示例中包含一个共享计数器Counter,初始值为0,存在4个线程,其中2个线程会对计数器进行加一操作,另外2个线程会进行减一操作。当计数器的值达到10时,所有线程将被唤醒并执行结束。

代码实现
import threading

class Counter:
    def __init__(self):
        self.value = 0
        self.cond = threading.Condition()

    def inc(self):
        with self.cond:
            self.value += 1
            print(f"Inc: {self.value}")
            if self.value == 10:
                self.cond.notify_all()

    def dec(self):
        with self.cond:
            self.value -= 1
            print(f"Dec: {self.value}")
            if self.value == 10:
                self.cond.notify_all()

def inc_thread(counter):
    for i in range(10):
        counter.inc()
        threading.currentThread().sleep(0.1)

def dec_thread(counter):
    for i in range(10):
        counter.dec()
        threading.currentThread().sleep(0.1)


if __name__ == "__main__":
    counter = Counter()
    incthreads = [threading.Thread(target=inc_thread, args=(counter,)) for _ in range(2)]
    decthreads = [threading.Thread(target=dec_thread, args=(counter,)) for _ in range(2)]
    for t in incthreads + decthreads:
        t.start()
    for t in incthreads + decthreads:
        t.join()

首先定义了一个计数器Counter,其中维护着一个int类型的值和一个Condition对象,Condition对象用来进行线程同步。

计数器有两个方法inc和dec,分别对计数器的值进行加一和减一操作。

在inc和dec方法中通过with self.cond:获取Condition对象的控制权,然后将计数器的值加一或减一,并判断计数器的值是否等于10,如果等于10,就通过self.cond.notify_all()唤醒所有等待Condition对象的线程。

在两个线程函数inc_threaddec_thread中,循环10次进行计数器的操作,并使用sleep(0.1)模拟计数器的变化速度。

最后在主函数中创建多个inc_thread和dec_thread线程并启动,等待线程依次执行完毕。当计数器的值达到10时,所有线程被唤醒并一起结束。

总结

使用注释休眠的方法能够实现多对多的等待/唤醒操作,并且能够避免线程进入无限等待状态。在实际开发中,需要根据具体应用场景,合理选择线程同步机制,并进行适当的调优,才能保证程序的正确性和性能。