首页IT科技python的线程(Python如何进行线程切换)

python的线程(Python如何进行线程切换)

时间2025-08-05 12:17:39分类IT科技浏览5584
导读:线程切换...

线程切换

条件对象能让一个线程 A 停下来                ,等待其他线程 B                    ,线程 B 满足了某个条件后通知(notify)线程 A 继续运行             。线程首先获取一个条件变量锁        ,如果条件不足            ,则该线程等待(wait)并释放条件变量锁                    ,如果满足就执行线程           ,也可以通知其他状态为 wait 的线程                        。其他处于 wait 状态的线程接到通知后会重新判断条件       。

无论是多进程还是多线程        ,只要数量一多                     ,效率肯定上不去              ,为什么呢?

我们打个比方    ,假设你不幸正在准备中考                      ,每天晚上需要做语文             、数学                        、英语       、物理         、化学这5科的作业                 ,每项作业耗时1小时         。

如果你先花1小时做语文作业,做完了                   ,再花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太太                    ,你的选择太明治了。

相关推荐:

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
火车头采集器怎么采集图片(火车头采集v9图文教程)