最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python如何进行线程切换

    正文概述    2020-06-02   156

    线程切换

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

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

    Python如何进行线程切换

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

    如果你先花1小时做语文作业,做完了,再花1小时做数学作业,这样,依次全部做完,一共花5小时,这种方式称为单任务模型,或者批处理任务模型。

    假设你打算切换到多任务模型,可以先做1分钟语文,再切换到数学作业,做1分钟,再切换到英语,以此类推,只要切换速度足够快,这种方式就和单核CPU执行多任务是一样的了,以幼儿园小朋友的眼光来看,你就正在同时写5科作业。

    但是,切换作业是有代价的,比如从语文切到数学,要先收拾桌子上的语文书本、钢笔(这叫保存现场),然后,打开数学课本、找出圆规直尺(这叫准备新环境),才能开始做数学作业。操作系统在切换进程或者线程时也是一样的,它需要先保存当前执行的现场环境(CPU寄存器状态、内存页等),然后,把新任务的执行环境准备好(恢复上次的寄存器状态,切换内存页等),才能开始执行。这个切换过程虽然很快,但是也需要耗费时间。如果有几千个任务同时进行,操作系统可能就主要忙着切换任务,根本没有多少时间去执行任务了,这种情况最常见的就是硬盘狂响,点窗口无反应,系统处于假死状态。

    所以,多任务一旦多到一个限度,就会消耗掉系统所有的资源,结果效率急剧下降,所有任务都做不好。

    相关推荐:《Python视频教程》

    下面为一个有趣的例子

    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太太,你的选择太明治了。

       相关推荐:

    Python中的线程和多线程是什么


    起源地下载网 » Python如何进行线程切换

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元