Python为什么推荐使用多进程

在编程过程中,Python的多线程经常被称为鸡肋。经常听人说,Python推荐使用多进程。那么具体原因是什么呢?

1.进程和线程

进程(Process)是计算机的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统的基础。而线程则是操作系统进行运算调度的最小单位。它被包含于进程之中,是进程的实际执行单位。线程是程序中的一个单一的顺序控制单元,是系统独立调度和分派CPU的基本单位。在单个程序中同时运行多个线程完成不同的工作,成为多线程

在C++,Java等语言中,通常都会使用多线程来充分利用CPU资源,加快程序运行速度。但在Python,却是更推荐使用多进程。那么这是为什么呢?

2.为什么Python多线程效率不高?

主要原因就在于Python在设计之初,从数据安全角度考虑而引入了GILGIL全称为Global Interpreter Lock(全局解释器锁),在一个Python进程中,只有一个GIL。

而在Python中,每个线程的执行方式为:1.获取GIL;2.执行代码直到Sleep()或者Python虚拟机将其挂起;3.释放GIL。也就是说,某个线程想要执行即获得CPU资源,必须获取GIL。即一个进程中线程之间只能串行执行。

Python2.x中,GIL的释放逻辑为:1.遇到IO操作;2.ticks计数达到100(ticks可以看作是Python自身的一个计数器,专门做用于GIL,每次释放后归零,这个计数可以通过 sys.setcheckinterval 来调整)。

在GIL释放后,线程之间进行锁竞争线程切换,会消耗资源。同时由于GIL锁的存在,一个进程只能同时执行一个线程,在多核CPU中,Python多线程效率并不高。

3.Python什么时候使用多线程?

Python多线程效率不高,是不是意味着Python的多线程毫无用处呢?并不是,还得分情况讨论:

  1).CPU密集型程序:即循环,计算很多的程序。在这种情况下,由于计算很多,ticks计数会很快达到阈值(100),引发GIL的释放与再竞争,会浪费很多资源。所以CPU密集型程序不推荐使用Python多线程。需要注意的是,在Python3.x中,虽然讲GIL的计数改为计时器(执行时间达到阈值,释放GIL),但仍未解决单进程同时只能执行一个线程的问题,依然不推荐使用。

   2).IO密集型程序:即文件处理,网络爬虫等。单线程状态下,IO操作会有IO等待,浪费等待时间,而多线程则可在一个程序等待时,自动切换到下一个程序,节省CPU资源,从而提高运行效率。所以Python多线程对IO密集型程序更为友好

4.为何多核多线程比单核多线程效果更差?

主要原因是线程颠簸(thrashing)单核多线程,每次释放GIL,唤醒的线程都能获取到GIL,所以能够无缝执行。但多核多线程下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸,导致效率更低。

所以,在Python中,想要提高执行效率,多核CPU情况下使用多进程是更适合的方法。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值