知行编程网知行编程网  2022-11-18 17:00 知行编程网 隐藏边栏  77 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python如何进行线程切换的相关知识,包括Python 多线程,以及线程切换耗时这些编程知识,希望对大家有参考作用。


线程切换

条件对象允许一个线程A停下来等待其他线程B。当线程B满足某个条件后,通知(notify)线程A继续运行。线程首先获取一个条件变量锁。如果条件不充分,则线程等待(wait)并释放条件变量锁。如果满足,则执行该线程,同时也可以通知其他处于等待状态的线程。其他处于等待状态的线程收到通知后会重新评估条件。

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

Python如何进行线程切换

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

如果你先花1个小时做中文作业,做完后再花1个小时做数学作业,这样你一个一个完成,总共需要5个小时。这种方法称为单任务模型或批处理任务模型。

假设你打算切换到多任务模式,你可以做1分钟中文,然后切换到数学作业,做1分钟,再切换到英语,以此类推,只要切换速度够快,这个方法就可以了使用单核 CPU 执行。多任务处理是一样的。从幼儿园小朋友的角度来看,你是在同时做5个作业。

然而,转换作业是有代价的。比如从中文转数学,首先要清理桌子上的中文书本和笔(这叫保存场景),然后,打开数学课本,找到一个罗盘尺(这叫备考)。新环境))开始做数学作业。当操作系统切换进程或线程时也是如此。需要保存当前执行的现场环境(CPU寄存器状态、内存页等),然后准备新任务的执行环境(恢复上次的寄存器状态、切换内存页等)开始执行.虽然这个切换过程很快,但也需要时间。如果有上千个任务同时运行,操作系统可能主要是忙于切换任务,没有太多时间来执行任务。

因此,一旦多任务处理的数量达到极限,就会消耗系统的所有资源,从而导致效率急剧下降,所有任务都无法做好。

下面为一个有趣的例子

import threading
class Boy(threading.Thread):
    def __init__(self, cond, name):
        super(Boy, self).__init__()
        self.cond = cond
        self.name = name
    def run(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()
class Girl(threading.Thread):
    def __init__(self, cond, name):
        super(Girl, self).__init__()
        self.cond = cond
        self.name = name
    def run(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太太,你的选择太明治了。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享