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

Tianyi_Li 发表于 2020/05/30 11:08:45 2020/05/30
【摘要】 多线程,这个名词大家应该比较熟悉。比如说在我们电脑的处理器一般是xxx核xxx线程,比如我的电脑的处理器是Intel Core i7-9750H,是6核12线程处理器,一般情况下,一个核同时只能有一个任务执行。多核时才可以支持多个线程同时执行。但通过采用超线程技术,Intel Core i7-9750H实现了增加一倍的线程,即达到了12个线程,使得对于多任务处理能够更好的运行。

前言

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

那么线程到底是什么呢?

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

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

image.png

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


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


1. 多线程初识


image.png


运行结果

image.png

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


2. 线程同步


image.png

image.png


运行结果

image.png

注意,这里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而言,现在一般应该都是多核处理器了)。







【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。