昇腾】【每天进步一点点】Python中的多线程一点思考

网友投稿 543 2022-05-30

前言

多线程,这个名词大家应该比较熟悉。比如说在我们电脑的处理器一般是xxx核xxx线程,比如我的电脑的处理器是Intel Core i7-9750H,是6核12线程处理器,一般情况下,一个核同时只能有一个任务执行。多核时才可以支持多个线程同时执行。但通过采用超线程技术,Intel Core i7-9750H实现了增加一倍的线程,即达到了12个线程,使得对于多任务处理能够更好的运行,但对于游戏这种对频率 有更多需求的应用来说,多线程就没什么太大优势了,这时频率起到了主要作用。

那么线程到底是什么呢?

线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

简单来说,多线程可以草率的理解为:同时执行多个不同的应用程序,相当于并行处理,同时做了多件事。很明显,优势很大。我们看看对它的评价:

每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。每个线程也都有自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

好了,好了,是不是有些凌乱了,理论总是枯燥的,直接看看代码,在实战中理解吧,以下代码在华为云ModelArts NoteBook中,使用CPU 2核下验证。

1. 多线程初识

运行结果

可以看到两个线程交替执行,work1先执行一次,打印了“0”,之后work2执行,打印了“0”,然后又是work1执行打印了“1”,以此类推。在程序运行中,你可以看到work1和work2同时打印了“0”,之后,又同时打印了“1”,“2”,仿佛work1和work2同时在运行一样。

2. 线程同步

运行结果

注意,这里test2的每次运行结果可能不一样,但最终结果是一样的,即200 0000。

这里使用两个线程对同一个变量操作,每个线程完成100 0000次累加,两个线程同步后,共计完成 200 0000次累积,得到最终200 0000结果。

好了,多线程大概就是这样了,还有其他的一些内容,以后有机会再来说。其实在Python中,无论处理器有多少个核,同时只能执行一个线程。这就是由于GIL的存在导致的。GIL的全称是Global Interpreter Lock(全局解释器锁),来源是Python设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个Python进程中,GIL只有一个,拿不到通行证的线程,就不允许进入CPU执行。

所以,想要充分利用多核CPU,就用多进程,注意不是刚下讲的所线程哦,对于进程和线程的区别,可以简单理解为进程是一个国家,线程是这个国家一个具体的城市,一个进程可以有多个线程,就像一个国家可以有多个城市,但一个线程要在一个进程的依赖下,就像我们写跨国通信地址的时候,写这个城市前,要先写这个国家。因为每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,在Python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言,现在一般应该都是多核处理器了)。

【昇腾】【每天进步一点点】Python中的多线程一点思考

昇腾 人工智能 AI

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C 语言编程 — 头文件
下一篇:干货系列—华为云医疗影像解决方案
相关文章