您的当前位置:首页正文

Python如何进行线程切换

2024-07-18 来源:91汽车资讯网

线程切换

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

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

我们打个比方,假设你不幸正在准备中考,每天晚上需要做语文、数学、英语、物理、化学这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太太,你的选择太明治了。

   相关推荐:

91汽车资讯网还为您提供以下相关内容希望对您有帮助:

python多线程的几种方法

Python多线程的几种方法:1. 使用`threading`模块:Python标准库中的`threading`模块提供了多线程支持。可以通过创建`Thread`对象来开启新的线程。这是实现多线程编程的基础方法。2. 使用`concurrent.futures`模块:Python的`concurrent.futures`模块提供了更高级的异步任务处理机制,包括线程池和进程池。它简...

如何进行Python多线程编程,一文读懂Python多线程

开始学习Python多线程Python中使用线程有两种方式:函数或者用类来包装线程对象。函数式:调用thread模块中的start_new_thread()函数来产生新线程。语法如下:thread.start_new_thread ( function, args[, kwargs] )参数说明:1.

Python中怎么在终止一个线程的同时终止另外一个线程?

设置一个全局变量,初值为False 设置键盘监听事件,当监测到特定按键时,将全局变量的值修改为True 在每个子线程中,循环检测全局变量的值,当检测到值为True时退出线程函数。

小白都看懂了,Python 中的线程和进程精讲,建议收藏

程序将 task 函数提交(submit)给线程池后,submit 方法会返回一个 Future 对象,Future 类主要用于获取线程任务函数的返回值。由于线程任务会在新线程中以异步方式执行,因此,线程执行的函数相当于一个“将来完成”的任务,所以 Python 使用 Future 来代表 Future 提供了如下方法:使用线程池来执行线程任...

一篇文章带你深度解析Python线程和进程

使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计。如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助。 线程与进程 什么是进程 进程是系统进行资源分配和调度的一个独立单位 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分...

一文带你读懂Python线程

优点:当有多个处理机时,一个进程的多个线程可以同时执行。缺点:由内核进行调度。用户线程的优缺点:优点:线程的调度不需要内核直接参与,控制简单。可以在不支持线程的操作系统中实现。创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多。允许每个进程定制自己的调度算法,线程管理比较灵活。...

python中如何让一个新建线程执行完后返回当前主线程

传一个对象参数进新建线程,新建线程执行完之后把当前主线程写入进对象,其他线程直接使用传进去的对象就能得到了(新线程执行完之后)

python怎么使同一个函数多线程调用两次

如果是同一包里面,直接就可以使用,如果不是同一个包,那么需要先import后,通过“包名.类名”才能使用。 下面是同一个包里面的案例: def a(): print(1) def b(): a() print (2) b()

python多线程能提高效率吗

2、阻塞操作:当程序中存在阻塞操作,如网络请求、文件读写等,使用多线程可以在一个线程被阻塞时,切换到其他线程继续执行,从而充分利用等待时间,提高效率。3、多核处理器:在拥有多个核心的处理器上,多线程可以利用多个核心同时执行任务,实现并行处理,从而加速程序的执行。Python中的多线程在特定情况...

python 怎么实现多线程的

线程也就是轻量级的进程,多线程允许一次执行多个线程,Python是多线程语言,它有一个多线程包,GIL也就是全局解释器锁,以确保一次执行单个线程,一个线程保存GIL并在将其传递给下一个线程之前执行一些操作,也就产生了并行执行的错觉。

Top