btcq.net
当前位置:首页 >> python多线程坑 >>

python多线程坑

因为python的全局解释器锁(global interpreter lock,gil)强制要求python只能在一个解释器中进行,也就是说即使你有多个处理器,python也只能使用其中的一个,线程实际上是在串行运行.如果只有一个处理器,那么python的线程和其他语言没

GIL blablabla concurrent blablabla简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode.UPDATE:

python的解释器CPython中存在着GIL(全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL.所以,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态.这就造成了即使在多核CPU中,多线程也只是做着分时切换而已.

这个属于历史上讨论很多的问题,可以说GIL保留到现在还是有很多原因的,其实不光python,c或者其他语言都是单进程单核占用,可以使用多进程使用提高效率,多线程的存在主要处理IO密集型问题.而且多线程占用资源更少,感兴趣可以查下python协程,微线程等相关资料.

因为有全局解释锁(GIL)

虽然 Python 提供了多线程包 但是 Python 并不支持真正意义上的多线程Python 中有一个叫 GIL 的东西 它能确保代码中永远只有一个线程在执行经过 GIL 的处理 会增加执行的开销 这就意味着 如果很关心代码执行效率的话 使用 threading 并不是一个好办法当然如果代码是 I/O 密集型 那么多线程倒是可以明显提高效率如果代码是 CPU 密集型的话 多线程大部分就是鸡肋了

因为python解释器同一个时间只能使用一个cpu,所以再多的线程还是使用同一个cpu真正的多线程是充分利用多个cpu的计算能力的

CPython中有一个Global Interpreter Lock(GIL),这个锁的作用是防止多个线程同时访问一段python代码.因此同一段python代码无法同时在多个CPU核上运行,即无法发挥多线程的并行优势.一些其他的Python解释器,比如Jython,是没有这个GIL的.

因为GIL.所以多核cpu和单核cpu,在执行同样的python多线程程序时,效率相差无几.

因为python的全局解释器锁的机制,导致python的多线程并不是真正的多线程,效率上不仅不会比单线程快,反而可能更慢,所以说是鸡肋,要求速度好话,可以用多进程来实现

bycj.net | gsyw.net | bdld.net | jclj.net | alloyfurniture.com | 网站首页 | 网站地图
All rights reserved Powered by www.btcq.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com