问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python的多线程是否能利用多核计算

发布网友 发布时间:2022-05-11 02:22

我来回答

3个回答

懂视网 时间:2022-05-11 06:43

今天看了一篇文章Python 最难的问题,说到Python受限于GIL。不要使用多线程,请使用多进程。

问:
  1. Python多核利用的问题,在以后会解决吗?
  2. 其他解释型语言,如Ruby是不是也存在同样的问题?
  3. 目前的解决方案是什么?

回复内容:

Ruby也有GIL,其实GIL并不是性能问题的根源,性能问题的根源是GC。

假设去掉GIL,像Java那样的多核多线程,你会面临更多头疼的OOM问题,以及GC问题,Java的一次Full GC是stop whole world的,你不希望你整个服务器8颗内核一起stop,等待GC完成吧?

所以Java这么多年疯狂投入努力改进VM的GC效率,搞出来各种GC算法,特别是并行GC算法。而且在大内存服务器上,为了提高GC效率,避免过大的内存堆扫描开销,Java现在也强调单机跑多进程呢。

所以你认为Python/Ruby去掉GIL,就解决问题了吗?事实上会引入更多更麻烦的问题。

如果为了提高IO并发性能,用协程就同样可以达到目的,Ruby现在原生支持协程,Lua则是协程方面效率极高的脚本语言,已经证明了这条路。

最后说到多核的问题,Ruby未来发展方向是MVM,即单进程里面跑多个VM,每个CPU内核跑一个VM,每个VM有自己的GC。这个办法其实很不错,既有效利用了进程共享内存,又可以支持多核并行,还解决了全局GC的性能问题。
  1. 在可以遇见的相当长一段时间内,Python 的官方实现 CPython 不会解决 GIL 的问题。
  2. Ruby 的官方实现 MRI 也有这个问题。
  3. 解决方案有很多,最常见的当然是用多进程。如果条件允许,也可以选择没有 GIL 限制的实现,比如基于 JVM 的 Jython 和 JRuby。
Python当然可以利用多核。

关于Python最大的误区大概就是“Python的多线程不能利用多核”会传来传去以后变成“Python不能利用多核”。

以现在Python主流应用之一服务器开发举例,根据CPU核心开对应数量的进程是非常普遍的做法。

至于非要用“多线程”的场合(比如异步),也有不少“协程”方案可以使用,比如stackless python,又比如greenlet,以及由此发展出的可爱的gevent。 首先,语言应该在什么级别支持多线程。C 通过操作系统的 preemptive scheduler 支持多线程,同时提供 critical section, wait/notify 这样的同步机制。问题在于,这样的同步机制太低级,在实际应用中经常需要封装为高级的同步机制,比如多线程的生产者-消费者队列。高级动态语言的设计者面临三个选择:
  1. 在语言中直接提供类似 C 的机制(Java);
  2. 设计良好的 C 接口,在同一进程中运行多个虚拟机,利用 C 把低级同步机制封装成多虚拟机之间的高级同步机制(Lua),或者把多线程优化完全封装在一个 API 之内(比如 Intel MKL 的各种多核算法)。
  3. 多进程。
方法 1 是得不偿失的。因为低级同步机制的优势在于效率,而考虑效率就必须考虑诸如 L1/L2/L3 cache 实效之类的底层情况。这对于解释执行的语言(即使有 JIT)来说是无法控制的。所以高级动态语言提供底层同步机制实际没有必要。应该多走方法 2 和 3。其中又以 2 最为灵活。

移除 GIL 难吗?不难,因为根本没有必要移除。如果 Python 能在一个进程中初始化多个 VM,同时其标准库在 C 级别做出足够多的常用多核优化就没有问题。Python 其实是希望实现另一个功能,异步操作。尽管异步操作和并行计算都可以通过多线程来完成,但是其实前者更加适合用协程或者用户级线程来完成。但是 Python 是 stackful 实现,也就是 byte code 借用 C runtime stack 来维护自己的运行状态。这种机制的弱点就是不容易用跨平台的方式来实现协程,所以利用 OS 多线程加 GIL 也就成了模拟协程语意的妥协手段。

补充一下。C 的线程和线程同步机制虽然底层,但是只有这种机制才能覆盖所有 use case。而其它的高层抽象只能适合某种 case。所以,当我说高级动态语言需要高级的线程操作时,我的隐含意思是这种语言同时还要有和 C 进行良好的互操作来随时扩展这种抽象。

推荐阅读

道可叨 | python 线程,GIL 和 ctypes

这篇文章从:

1.python 不必要去除GIL, 去除GIL了运行效率会降低

2.使用多进程并行代码

3.使用ctypes绕开GIL实行多线程并行

解释了GIL

同意梁智的答案。

如果有多核,那应该是要追求大并发,高吞吐量。
这时候python还是洗洗睡吧。

当然这个世界上总是有些很奇葩的技术。

例如用C#写的操作系统。
SharpOS (operating system)

一个技术费了很大功夫去实现了别的技术轻而易举就可以完成的事情。
不是一件值得高兴和称赞的事情。

工具是用来解决问题的,不是制造问题。 1,暂没有计划,主要是对现有GC的有影响很大,有实现难度。
2,同Rio的答案,不过其他语言不了解了。
3,
GIL的影响没想象的那么大,比如对于io密集型(网络/磁盘)程序。

pypy之前提供了一个去掉GIL的思路(基于STM):
http://morepypy.blogspot.jp/2011/06/global-interpreter-lock-or-how-to-kill.html
但是在pypy2.0版本中还是没有做到去掉GIL。

除了多进程之外,采用协程(stackless python)也是一个不错的解决思路,不过我也没有做过性能测试。 。。。。谁告诉你不能利用了 CPython不能直接支持多线程的理由全是bullshit,Java/C#从第一版就支持,因为这本来就是理所应当的 这是一个好问题。由于GIL的限制cPython无法简单充分利用多核处理器的并行处理能力,而使用multiprocessing之类的多进程方式,在进程间通信上会耗费额外多的开销,也达不到多线程应有的效率。

另一方面看来,目前python在大数据量高并发度方面的瓶颈并不是很明显,python通常用于处理轻量级的任务。在我工作中使用python处理上T级别的自然语料库的时候,也是依托于mapreduce平台,所以大数据处理中不能多线程实际上也并不是一个很明显的问题。

而且彻底修改现在的GIL机制牵扯到从底层重新设置cPython的核心,包括资源同步、gc策略等等,如果真的这样修改,会大大降低python处理简单单线程任务的性能,因为即使是单线程也需要做资源同步的话,开销是相当大的。所以cPython在可预见的未来都不会改掉现在的GIL。

热心网友 时间:2022-05-11 03:51

比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。看起来很不可思议?但是这就是GIL搞的鬼。任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。

热心网友 时间:2022-05-11 05:09

不能,GIL
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
火狐浏览器如何将网页保存为PDF文件 【亲测好用】网页下载保存为pdf u盘坏芯片坏能修吗-(u盘芯片坏了能修吗) 快捷糖水目录 微信上如何和男人撒娇? 去日本旅游要带什么好? 年月日电脑怎么设置表格excel表格出生日期列如何设置为年月日格式 ...一定要对女主好,宠她。要打包下载,谢谢亲。 空气净化器滤芯有酸味的原因 不同种类的蛋糕分别代表什么含义呢? 未成年离家出走,多长时间可以报案? 孩子离家出走多久可以报案 孩子离家出走可以报警吗 离家出走可以报警吗 小孩子离家出走多久可以报警 叛逆期孩子离家出走多久报警 孩子叛逆离家出走报警有用吗? 华为荣耀5X操作失败变砖开不了机了怎么办 美制螺纹公称直径28.3螺距是多少? 美制螺纹10-32外经多大,螺距多少 npt1-1/2美制螺纹螺距,和1-1/2螺距相同吗 美制螺纹1一8unC大径有多大 美制2-1/8-16外径是多少螺距是多少? 美制4分之3螺纹螺距多少? 上坟烧纸把小人的名字写上好不好 请问烧纸有什么禁忌,还有写名字怎么写,求解 农历十月初一想给去世的亲人烧包袱,但要在包袱上写上自己的名字,还有去世亲人的名字,但留是不知道应该 七月十五鬼节又到了,请问给亲人上坟烧纸,能不能把死者的名字写在纸钱上? 给已故的人烧纸,最后用写谁烧的吗? 烧纸钱画圈里面写名字吗 新能源汽车慢充的电压范围是多少? 新能源汽车充电显示320v什么意思 新能源充电电压190能充吗? 公益在线组织的活动有哪些? 有哪些硬科幻单机游戏? 11pro升级ios14.3可以降级吗 近未来科幻的FPS游戏有哪些,例如孤岛危机系列和使命召唤11之类 苹果11pro刷机? 现在还有什么比较好的科幻类游戏 有什么好玩的单机游戏,科幻! ??? 求推荐些科幻类单机游戏! 苹果11Pro更新了13.4.1两天了跟平常没什么区别要不要降级? 动作科幻的游戏好玩的推荐几个。 ipadpro 10.5寸ios11怎么降级 有什么比较新的科幻类的单机游戏好玩? 苹果手机11上pro max13.版本 现在想升13.1或者以上的版本 不想升到14可以吗? 苹果11pro升降到15.4怎么样 找一款科幻射击游戏 python能多核并行吗 科幻的即时战略游戏