Python如何进行线程切换
线程切换
条件对象允许一个线程 A 停下来,等待其他线程 B ,线程 B 满足某一条件后,通知(notify)线程 A 继续运行。线程首先获得条件变量锁。如果条件不足,线程将等待(wait)并释放条件变量锁。如果满足,执行线程也可以通知其他状态 wait 线程。其他地方 wait 接到通知后,状态线程将重新判断条件。
无论是多流程还是多线程,只要数量多,效率肯定不会提高。为什么?

我们举个例子,假设你不幸正在准备高中入学考试,你需要每晚做中文、数学、英语、物理和化学,每个作业需要1个小时。
如果你先花一个小时做语文作业,然后花一个小时做数学作业,这样你就可以依次完成它们,总共花5个小时。这种方法称为单任务模型或批处理任务模型。
假设你打算切换到多任务模型,你可以先做1分钟的汉语,然后切换到数学作业,做1分钟,然后切换到英语,等等,只要切换速度足够快,这样和单核CPU执行多任务是一样的,从幼儿园孩子的角度来看,你同时写5个家庭作业。
然而,切换操作是有成本的。例如,从汉语到数学,首先清理桌子上的中文书籍和笔(这被称为保存场地),然后打开数学教科书,找到一个圆形的尺子(这被称为准备一个新的环境),然后开始做数学作业。操作系统在切换过程或线程中也是如此。它需要保存当前的现场环境(CPU寄存器状态、内存页面等),然后准备新任务的执行环境(恢复最后一个寄存器状态、切换内存页面等)。开始执行。虽然切换过程非常快,但它也需要时间。如果同时执行数千项任务,操作系统可能主要忙于切换任务,没有太多时间执行任务。在这种情况下,最常见的是硬盘响应,点窗口没有响应,系统处于假死状态。
因此,一旦多个任务达到一定程度,系统的所有资源都将被消耗掉。因此,效率急剧下降,所有任务都做不好。
相关推荐:Python视频教程
以下是一个有趣的例子
importthreading classBoy(threading.Thread): def__init__(self,cond,name): super(Boy,self).__init__() self.cond=cond self.name=name defrun(self): self.cond.acquire() print(self.name+":嫁给我吧!?") self.cond.notify()#唤醒挂起的线程,让hanmeimei表态 self.cond.wait()#释放内部占用的琐事,同时挂起线程,直到收到通知后醒来或加班,等待hanmeimei回答。 print(self.name+":我一个人跪下,送戒指!") self.cond.notify() self.cond.wait() print(self.name+":Li太太,你的选择太明治了。") self.cond.release() classGirl(threading.Thread): def__init__(self,cond,name): super(Girl,self).__init__() self.cond=cond self.name=name defrun(self): self.cond.acquire() self.cond.wait()#等待Lilei求婚 print(self.name+":没有情调,不够浪漫,不答应") self.cond.notify() self.cond.wait() print(self.name+":好吧,答应你") self.cond.notify() self.cond.release() cond=threading.Condition() boy=Boy(cond,"LiLei") girl=Girl(cond,"HanMeiMei") girl.start() boy.start()
运行结果如下:
LiLei:嫁给我吧!?? HanMeiMei:没有情调,不够浪漫,不同意 LiLei:我一个人跪下,送戒指! HanMeiMei:好吧,答应你 LiLei:Li太太,你的选择太明治了。
相关推荐:
什么是Python中的线程和多线程?
