条件变量是一种比较复杂的线程同步机制
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' 条件变量,线程间通信提供的另一种锁,用于复杂的线程同步锁。 A先说话,B回答,也就是你一句我一句这种形式,你使用单纯的线程无法实现,就需要使用condition,Condition其实本质还是使用Rlock,当然你可以指定使用Lock, 实现的关键是Contition的wati和notify这两个函数。 ''' import threading from threading import Condition class A(threading.Thread): def __init__(self, condition, num): self.condition = condition self.num = num super().__init__(name='A') def run(self): with self.condition: for i in range(self.num): print('A say: %s + %s 等于多少 ?' % (str(i), str(i))) self.condition.notify() self.condition.wait() class B(threading.Thread): def __init__(self, condition, num): self.condition = condition self.num = num super().__init__(name='B') def run(self): self.condition.acquire() # 必须先获得锁才可以调用wait或者notify # with self.condition: # 这里没有使用with,其实如果不使用with你就手动加锁,然后释放。使用with就帮你自动完成,这就和 with open()自动关闭文件流式一样的。 for i in range(self.num): self.condition.wait() print('B say: %s + %s 等于 %s.' % (str(i), str(i), str(i+i))) self.condition.notify() self.condition.release() if __name__ == '__main__': condition = Condition() a = A(condition, 5) b = B(condition, 5) ''' 这里要注意,虽然是a先说话,但是要先启动b,使用了condition的话线程的启动顺序很重要。如果先启动a,那么就会一直卡住。为什么? 先启动a,那么就会先执行notify,而b还没有启动也就意味着没有wait,所以卡住了,也就是说notify的前提是先有wait才可以。换句话 说就是你要通知就得先有人在等,在没人等的情况下你通知了这样你就无法获得回复所以就一直卡在那里。所以先启动b就是先等待,然后启动a a说完话就通知,这样b可以收到然后处理,然后b回复,之后唤醒a,这样相继执行。 其实Condition和event是类似的可以理解为基于事件的通知机制。 注意事项: 1. 先调用 with self.condition 或者是 acquire() 也就是先加锁才可以使用wait和notify 2. 如果手动加锁之后要手动释放 3. 线程启动顺序很重要 ''' b.start() a.start()相关文章
守护进程linux(守护进程 linux)
守护线程经常被用来执行一些后台任务,线程能够自动关闭,只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程随着JVM一同结束工作,守护线程最典型的应用就...
科技 网编 169
linux c++ 多线程(c linux 多线程)
也就是说允许单个程序创建多个并行执行的线程来完成各自的任务,-a显示一个终端的所有进程,-x显示没有控制终端的进程,-h显示进程的层次(和其它的命令合用。1)p...
科技 网编 148
21.1 TLS简述–《Windows核心编程》
所以更多的推荐用基于堆栈的自动变量或函数参数来访问数据。因为基于堆栈的变量总是和特定的线程相联系的,将数据与一个正在执行的特定函数关联起来。线程局部存储是将现有...
科技 网编 283
什么是分布式锁?实现分布式锁的三种方式
如果需要对某一个共享变量进行多线程同步访问的时候,一个应用需要部署到几台机器上然后做负载均衡,变量A存在三个服务器内存中(这个变量A主要体现是在一个类中的一个成...
科技 网编 146
amd组装机配置单(amd电脑组装配置单)
显卡七彩虹GTX1660TiADSpecialOC:硬盘威刚XPG-S11Lite512G固态硬盘:键鼠装用户自选--。amd核显装机配置推荐202...
综合 网编 141
电脑程序无响应的原因:电脑程序无响应的原因是什么
电脑程序无响应的原因:3、电脑网速有问题,在系统中每个运行的应用程序都会有一个进程,就会给我们提示程序无响应,一种是线程在处理某个工作量大的内容未及时给出反应,...
军事 网编 206
网络编程:多进程实现TCP服务端并发、互斥锁代码实操、线程理论、创建线程的两种方式、线程的诸多特性、GIL全局解释器锁、验证GIL的存在
defget_talk(sock):print(data.decode('utf8')):p=Process(target=get_talk!args=(...
科技 网编 229
线程(Thread)基本用法
th_01=threading.Thread(target=run_01)#创建线程,我们可通过实例化Thread类来创建一个子线程:args=("t...
教育 网编 231
留言评论取消回复
评论列表