给企业做宣传网站的好处/衡阳网站优化公司
充分的利用CPU的性能优势,从而加快代码的执行速度
多线程的编程其实也是异步编程的一种形态
还记得之前提到的一个特性吗?对于单核的CPU,同一时刻,只允许一个线程来执行代码,那么多线程的意义在什么地方呢,理论上是这样的,但是对于多核的CPU,比如4核的CPU,让A核处理主线程,其他的核处理新开的线程,多核的CPU完全是,有能力让不同的核去处理不同的线程,这个时候其实就是在并行的处理程序,其实这个就是多线程的意义。说到这个地方,我们看似都非常的美好,多核的CPU有非常的强大,但是,很遗憾的额告诉大家,我们的python是没有办法充分利用多核CPU优势的。
一些有基础的同学可能听说过这么一句话,Python的多线程是鸡肋,那么这句话到底对不对呢?这就取决于你如何定义这个鸡肋了,在三国演义中,说所谓的鸡肋,食之无味,弃之可惜,当然,python的多线程还是有一定的意义的,如果没什么用,那还存在干啥呢,是吧。
先来说一下为啥Python不能使用多核CPU,主要是因为,Python中存在一个GIL,全局解释器锁,在内存资源中,一个进程可以有多个线程,线程之间共享资源,这就有可能多个线程访问同一个资源,这就造成了线程有可能是不安全的,为了保证线程安全就出现了锁,一旦我们对某一个对象加锁之后,不管有多少个线程,只有拿到锁的线程才能对相关的变量进行操作。
锁可以分为两类,一类是细粒度的锁,也就是程序员主动加的锁,一类是粗粒度的锁,解释器加的锁,比如,GIL,在python的解释器上,同一时刻只能有一个线程来执行,所以即使是多核的CPU也无能为力,在一定程度上保证了线程安全,比如有代码a+=1,这段代码到Python的解释器中会被翻译成bytecode,Python解释器会执行bytecode,这行代码可能被翻译成多段的bytecode,如果解释器正在执行这多段中的一段的时候,线程就被挂起了,然后切换到另外的线程执行,这个线程执行完,回来继续执行剩下的bytecode的时候,就不会保证该线程是安全的了,如果说a+=1这多段bytecode会一直执行完,不会被中断,那么就可以保证线程安全了。
Python其实只是语言的规范,关键起作用的是语言解释器,我们最常见的有cpython,jpython,GIL是在cpython中的,在jpyhton中是没有GIL的。
Python的多线程到底是不是鸡肋,每个语言都有它的优势同时也有它的缺点,比如,nodejs就是单进程单线程的,对于CPU密集型的程序,多线程的意义确实不大,但是对于我们来说,大多数情况下编写的都是IO密集型的程序,IO密集型的程序,查询数据库,请求网络资源,读写文件都属于IO操作,执行一段代码的时候,绝大多数时间都花在io操作上的程序,为io密集型程序,按照时间段消耗来划分。Python的多线程对于IO密集型程序是有一定的意义的,把线程等待的时间,换到别的线程使用CPU,这就是多线程在IO密集型程序中的优势。