python多线程不能利用多核cpu,但有时候多线程确实比单线程快。

python 为什么不能利用多核 CPU 

GIL 其实是因为在 python中有一个 GIL( Global Interpreter Lock),中文为:全局解释器锁。 

1、最开始时候设计GIL是为了数据安全

python为了数据安全设计了这个 GIL。

2、每个 CPU在同一时间只能执行一个线程:

(在单核 CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。 但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生(

2)在 python多线程下,每个线程的执行方式如下:

1、获取GIL

2、执行代码直到sleep或者是 python虚拟机将其挂起。

3、释放 GIL

为什么有时候多线程效率低于单线程? 

1、如上我们可以知道,在 python中想要某个线程要执行必须先拿到

GIL这把锁,且 python只有一个 GIL,拿到这个 GIL才能进入 CPU执行,

在遇到

I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔

100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval

来调整)。所以虽然 CPython 的线程库直接封装操作系统的原生线程,但 CPython

进程做为一个整体,同一时间只会有一个获得了

GIL 的线程在跑,其它的线程都处于等待状态等着

GIL 的释放。

2、而每次释放 GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于

GIL锁存在,python里一个进程永远只能同时执行一个线程 (拿到 GIL的线程才能执行

),这就是为什么在多核

CPU上, python的多线程效率并不高。

python的多线程是否就完全没有用了呢?

相同的代码,为何有时候多线程会比单线程慢,有时又会比单线程快?

这主要跟运行的代码有关:

1、 CPU密集型代码

(各种循环处理、计数等等 ),在这种情况下,由于计算工作多, ticks计数很快就会达到

100阈值,然后触发 GIL的释放与再竞争 (多个线程来回切换当然是需要消耗资源的),所以 python下的多线程遇到 CPU密集型代码时,单线程比多线程效率高。

IO密集型代码 (文件处理、网络爬虫等 ),多线程能够有效提升效率

(单线程下有 IO操作会进行 IO等待,造成不必要的时间浪费,而开启多线程能在

线程

A等待时,自动切换到线程

B,可以不浪费

CPU的资源,从而能提升程序执行效率

)。

进行 IO密集型的时候可以进行分时切换 所有这个时候多线程快过单线程(

5)如果 python想充分利用多核 CPU,可以采用多进程, 每个进程有各自独立的

GIL,互不干扰,这样就可以真正意义上的并行执行,所以在

python中,多进程的执行效率优于多线程

(仅仅针对多核 CPU而言 )。

所以在多核 CPU下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率。

原文地址:https://www.cnblogs.com/bo-test1985-dd/p/9116132.html

时间: 2024-10-10 06:18:38

python多线程不能利用多核cpu,但有时候多线程确实比单线程快。的相关文章

为什么python的多线程不能利用多核CPU?

为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快. 一.python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行,在遇到I/O 操作时会释放这把锁. 如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval 来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处

利用多核CPU来加速Linux命令 — awk、sed、bzip2、grep、wc

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核.借用卡通人物Cartman的话,"如何我能使用这些内核"?要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作

python多线程为什么不能利用多核cpu

GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU.在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU.那如何能让它在双核

转摘--如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核. 借用卡通人物Cartman的话,“如何我能使用这些内核”? 要想让Lin

在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析

首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时候cpu的使用效率: 1)单线程执行的时候: 2)多线程执行的时候: 3)多进程执行的时候: 总结: 1)单进程单线程时,对于双核CPU的利用率只能利用一个核,没有充分利用两个核. 2)单进程多线程时,对于双核CPU的来说,虽然两个核都用到的,不过很明显没有充分利用两个核,这里要说一个GIL(全局解

python GIL锁与多cpu

多核CPU   linux : cat /proc/cpuinfo 如果你不幸拥有一个多核CPU,你肯定在想,多核应该可以同时执行多个线程. 如果写一个死循环的话,会出现什么情况呢? 打开Mac OS X的Activity Monitor,或者Windows的Task Manager,都可以监控某个进程的CPU使用率. 我们可以监控到一个死循环线程会100%占用一个CPU.如果有两个死循环线程,在多核CPU中,可以监控到会占用200%的CPU,也就是占用两个CPU核心.要想把N核CPU的核心全部

Nginx 开启多核cpu配置

nginx默认是没有开启利用多核cpu的配置的.需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu; 需要在nginx配置里添加 worker_processes 和 orker_cpu_affinity 两个配置: 1.假设服务器是 4核 CPU 开启 4个进程: worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000; 2.假设服务器是 8核 CPU 开启 8个进程: worker_processes

“多个单核CPU”与“单个多核CPU”哪种方式性能较强?

多个单核CPU: 成本更高,因为每个CPU都需要一定的线路电路支持,这样对主板上布局布线极为不便.并且当运行多线程任务时,多线程间通信协同合作也是一个问题.依赖总线的传输,速度较慢,且每一个线程因为运行在不同的CPU上.导致不同线程间各开一个Cache,会造成资源的浪费,同时如果线程间协作就会有冗余数据的产生,更加大了内存的开销. 单个多核CPU: 可以很好地规避基本上多个单核CPU提到的所有缺点.它不需要考虑硬件上的开销以及复杂性问题,同时也可以很好地解决多线程间协同工作的问题,减少内存的开销

多线程也不一定比单线程快

多线程似乎一直给我们这样的印象就是多线程比单线程快,其实这是一个伪命题.事无绝对,多线程有时候确实比单线程快,但也有很多时候没有单线程那么快. 首先简单区分一下并发性(concurrency)和并行性(parallel).并行是说同一时刻有多条命令在多个处理器上同时执行.并发是说同一时刻只有一条指令执行,只不过进程(线程)指令在CPU中快速轮换,速度极快,给人看起来就是”同时运行”的印象,实际上同一时刻只有一条指令进行. 但实际上如果我们在一个应用程序中使用了多线程,线程之间的轮换以及上下文切换