如何利用NotifyAll实现线程同步

   2024-09-30 2840
核心提示:NotifyAll 是一种线程同步机制,用于在多个线程之间进行通信和协作导入所需库:import threadingimport time创建一个共享资源类

NotifyAll 是一种线程同步机制,用于在多个线程之间进行通信和协作

导入所需库:
import threadingimport time
创建一个共享资源类,该类包含一个锁(Lock)对象和一个条件变量(Condition)对象。这将允许我们在多个线程之间同步对共享资源的访问。
class SharedResource:    def __init__(self):        self.lock = threading.Lock()        self.condition = threading.Condition(self.lock)
在共享资源类中添加一些方法来处理共享资源的状态更改。例如,我们可以添加一个方法来增加共享资源的值,并在值达到特定阈值时通知所有等待的线程。
class SharedResource:    # ... (previous code)    def increment_value(self):        with self.condition:            # Increment the shared resource's value            self.value += 1            # Check if the value has reached a specific threshold            if self.value >= self.threshold:                # Notify all waiting threads                self.condition.notify_all()
创建工作线程类,该类将执行特定任务并与共享资源交互。在此示例中,我们将创建一个线程,当共享资源的值达到阈值时,该线程将执行某个操作。
class WorkerThread(threading.Thread):    def __init__(self, shared_resource):        super().__init__()        self.shared_resource = shared_resource    def run(self):        with self.shared_resource.condition:            # Wait until the shared resource's value reaches the threshold            while self.shared_resource.value< self.shared_resource.threshold:                self.shared_resource.condition.wait()            # Perform some action when the condition is met            print(f"Thread {self.name} is performing an action")
在主程序中创建共享资源对象、工作线程对象并启动线程。
def main():    shared_resource = SharedResource()    # Create and start worker threads    worker_threads = [WorkerThread(shared_resource) for _ in range(3)]    for thread in worker_threads:        thread.start()    # Increment the shared resource's value    for _ in range(10):        time.sleep(0.5)        shared_resource.increment_value()    # Wait for all worker threads to finish    for thread in worker_threads:        thread.join()if __name__ == "__main__":    main()

在这个示例中,我们使用 NotifyAll 方法通知所有等待的线程,共享资源的值已达到阈值。这样,当条件满足时,所有等待的线程都将被唤醒并执行相应的操作。

 
举报打赏
 
更多>同类维修大全
推荐图文
推荐维修大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号