今天冷知识百科网小编 郑光香 给各位分享线程多了有什么用途的知识,其中也会对多线程是什么,有什么好处呢(多线程是什么概念)相关问题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在我们开始吧!

多线程是什么,有什么好处呢

举个例子,你要做饭,你要做的饭是米饭和一个炒菜。

多线程是什么,有什么好处呢

如果是单线程,那么你可以如下做:

第一种方法:先炒菜,然后开始蒸米饭;

第二种方法:先蒸米饭,等米饭熟了再炒菜;

如果是多线程,那么你就可以如下做:

先蒸米饭,在蒸米饭的过程中去炒菜。

有些问题的解决用多线程会提高效率,比如上边的例子。但是有时不会提高效率,反而会影响效率:

比如,你要洗衣服,还打算做家庭作业(假设你是小学生,老师给你布置的家庭作业)。

如果是单线程:你要么洗完衣服做作业,要么做完作业洗衣服。

如果是多线程:你洗一分钟衣服做一分钟作业,交叉进行,显然有些时间都耗在了任务的切换上了。

所以,多线程主要用于,当一个任务需要不占用资源的等待的时候,可以使用空闲的资源做其他的事情。比如类似于QQ聊天的程序,程序的一个线程一直在等待着看是否有好友发消息过来,而与此同时另一个线程允许你打字并且将自己的消息发送给对方。

以上例子并不是很完美,只是希望能借这些例子对多线程有所理解。

为什么有人说 Python 的多线程是鸡肋

因为 Python 中臭名昭著的 GIL。

那么 GIL 是什么?为什么会有 GIL?多线**的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。

多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 “1亿” 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?show me the code

单线程

在我的4核 CPU 计算机中,单线程所花的时间是 6.5 秒。可能有人会问,线程在哪里?其实任何程序运行时,默认都会有一个主线程在执行。(关于线程与进程这里不展开,我会单独开一篇文章)

多线程

创建两个子线程 t1、t2,每个线程各执行 5 千万次减操作,等两个线程都执行完后,主线程终止程序运行。结果,两个线程以合作的方式执行是 6.8 秒,反而变慢了。按理来说,两个线程同时并行地运行在两个 CPU 之上,时间应该减半才对,现在不减反增。

是什么原因导致多线程不快反慢的呢?

原因就在于 GIL ,在 Cpython 解释器(Python语言的主流解释器)中,有一把全局解释锁(Global Interpreter Lock),在解释器解释执行 Python 代码时,先要得到这把锁,意味着,任何时候只可能有一个线程在执行代码,其它线程要想获得 CPU 执行代码指令,就必须先获得这把锁,如果锁被其它线程占用了,那么该线程就只能等待,直到占有该锁的线程释放锁才有执行代码指令的可能。

因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换、锁机制处理(获取锁,释放锁等),所以,多线程执行不快反慢。

什么时候 GIL 被释放呢?

当一个线程遇到 I/O 任务时,将释放GIL。计算密集型(CPU-bound)线程执行 100 次解释器的计步(ticks)时(计步可粗略看作 Python 虚拟机的指令),也会释放 GIL。可以通过设置计步长度,查看计步长度。相比单线程,这些多是多线程带来的额外开销

CPython 解释器为什么要这样设计?

多线程是为了适应现代计算机硬件高速发展充分利用多核处理器的产物,通过多线程使得 CPU 资源可以被高效利用起来,Python 诞生于1991年,那时候硬件配置远没有今天这样豪华,现在一台普通服务器32核64G内存都不是什么司空见惯的事

但是多线程有个问题,怎么解决共享数据的同步、一致性问题,因为,对于多个线程访问共享数据时,可能有两个线程同时修改一个数据情况,如果没有合适的机制保证数据的一致性,那么程序最终导致异常,所以,Python之父就搞了个全局的线程锁,不管你数据有没有同步问题,反正一刀切,上个全局锁,保证数据安全。这也就是多线程鸡肋的原因,因为它没有细粒度的控制数据的安全,而是用一种简单粗暴的方式来解决。

这种解决办法放在90年代,其实是没什么问题的,毕竟,那时候的硬件配置还很简陋,单核 CPU 还是主流,多线程的应用场景也不多,大部分时候还是以单线程的方式运行,单线程不要涉及线程的上下文切换,效率反而比多线程更高(在多核环境下,不适用此规则)。所以,采用 GIL 的方式来保证数据的一致性和安全,未必不可取,至少在当时是一种成本很低的实现方式。

那么把 GIL 去掉可行吗?

还真有人这么干多,但是结果令人失望,在1999年Greg Stein 和Mark Hammond 两位哥们就创建了一个去掉 GIL 的 Python 分支,在所有可变数据结构上把 GIL 替换为更为细粒度的锁。然而,做过了基准测试之后,去掉GIL的 Python 在单线程条件下执行效率将近慢了2倍。

Python之父表示:基于以上的考虑,去掉GIL没有太大的价值而不必花太多精力。

CPU的多少核和多少线程数有什么用已及什么联系?

CPU的核数表示CPU可以同时执行的任务数量,在支持超线程情况下,同时执行的任务数翻倍。CPU的线程数表示CPU可以同时执行的任务数量。两者的联系分两种:CPU支持超线程技术,那么线程数=核心数*2;不支持超线程,线程数=核心数。

线程数和超线程技术是两个概念,线程数是实际存在的,而超线程是CPU的技术标准。

扩展资料

超线程的优缺点

一、优点

1、可以同时进行多任务处理工作,软件可以享有由超线程技术带来的性能提升;

2、用户同时运行两个以上软件的时候,可以充分发挥超线程技术的效率优势。

二、缺点

1、运行单线程软件时,超线程技术会降低系统性能;

2、因为很多工作站软件为Windows2000操作系统进行过优化,所以使用Windows2000的工作站无法完全利用超线程技术的优势;

3、当两个线程同时需要某个资源时,其中一个线程必须让出资源暂时挂起,直到这些资源空闲以后才能继续。因此,超线程的性能并不等于两个CPU的性能。

参考资料来源:百度百科-线程数

开发中为何要用多线程?

绝大多数程序都是单线程程序,如果程序中有多个任务,比如读写文件、更新用户界面、网络连接、打印文档等操作,比如按照先后次序,先完成前面的任务才能执行后面的任务。如果某个任务持续的时间较长,比如读写一个大文件,那么用户界面也无法及时更新,这样看起来程序像死掉一样,用户体验很不好。怎么解决这个问题呢?人们提出了多线程编程技术。在采用多线程编程技术的程序中,多个任务由不同的线程去执行,不同线程各自占用一段CPU时间,即使线程任务还没有完成,也会让出CPU时间给其他线程有机会去执行。这样在用户角度看起来,好像是几个任务同时进行的,至少界面上能得到及时更新了,大大改善了用户对软件的体验,提高了软件的友好度。根据进程与线程的支持情况,可以把操作系统大致分为如下几类:

(1)单进程、单线程,MS-DOS大致是这种操作系统。

(2)多进程、单线程,多数UNIX(及类UNIX的Linux)是这种操作系统。

(3)多进程、多线程,Win32(Windows NT/2000/XP/7/8/10等)、Solaris 2.x和OS/2都是这种操作系统。

(4)单进程、多线程,VxWorks是这种操作系统。

多线程cpu有什么好处?

多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

好处:

·使用线程可以把占据长时间的程序中的任务放到后台去处理

程序的运行速度可能加快

在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了,在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

最关键的一点,多线程可以让同一个程序的不同部分并发执行

CPU多线程同简称SMT。

SMT可通过复制处理器上的结构状态,让同一个处理器上的多个线程同步执行并共享处理器的执行资源,可最大限度地实现宽发射、乱序的超标量处理,提高处理器运算部件的利用率,缓和由于数据相关或Cache未命中带来的访问内存延时。当没有多个线程可用时,SMT处理器几乎和传统的宽发射超标量处理器一样。

多线程是什么意思?

我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。

多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源)

多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源;

主线程:在进程中至少存在一个主线程,其他子线程都由主线程开启,主线程不一定在其他线程结束后结束,有可能在其他线程结束前结束。Java中的主线程是main线程,是Java的main函数;