python是个有趣的编程语言,GIL也是python绕不过去的一个点。
随着深入学习的见识,越来越发现GIL已经深入到了python的本质上,这也是python3里面也不能除掉gil的原因。
gil:一种python的同时只能运行一个线程的保护机制,太多太多的库为了简单而使用了这个机制来保证数据的唯一性。
特点:当遇到python代码运行的时候,python线程运行会自动保持只有一个线程再运行,当遇到非python运行的时候,
自动停止这种机制。
深入思考超越gil的解决办法之后,我发现应当有3种办法能解决这种问题吧。
第一种,最传统的方式是利用异步+多进程的方式来解决,这是python最流行的主流方式。
那么缺点是什么?资源的消耗太大,变量的不稳定性,表述为多进程变量的共享在长期运行的情况下的不稳定
第二种,非主流的,经过深入思考研究之后感觉可行的方案,python转C 转python再运行,也即是cython。
结合python的多线程进行运行,python的多线程是真多线程,这是需要明白的一点。
那么缺点是什么?变量的不可控性,表述为python本身的变量跟转译之后的变量不能操作
第三种,这是离python本身最遥远的解决办法,python版本的再编译,python本身是在多线程的底层代码上嵌入了
gil,那么只要取消这一层底层代码就可以解决这个问题了。
但是python3光编译代码 就几十万行了。。。
那么缺点是什么?这也是难度最大最不可行的方案,问题并不是python这本身程序的问题,而是太多太多的库依赖于gil了,而
python的库本身就有很多是依靠靠爱发电的模式进行开发的,这才是python3也没有办法超脱gil的本质原因。
网友评论