嘉宾|杨群
出品|Python大本营(ID:pythonnews)
导读:阿里云数据库提供了稳定可靠、可弹性伸缩的在线数据库服务,在数据库存储引擎、云原生技术、分析引擎、分布式处理、FPGA/GPU硬件加速、智能数据库、智能化管控平台、安全数据库等方面有较好的表现。
4月13日,在CSDN主办的“2019 Python开发者日”大会上,阿里云数据库专家杨群分享了《高并发场景下Python的性能挑战》的主题演讲。
以下为演讲整理,文章略有删减:
性能问题
▌(一)GIL
为什么大家都说Python慢?最主要的原因是全局解释器锁。今天讲的Python是官方的C版Python。CPython在创建变量时,首先对变量分配内存,然后开始计数变量的数量,大家提出称之为“引用计数”。在引用计数变为0时,从系统中释放变量的内存。如果多个线程同时对这个计数做操作,线程不安全,会导致很多问题。
综合垃圾回收机制问题,CPython引入了GIL,同一个时刻在一个进程允许一个线程使用解释器,意味着单进程下Python多线程的性能没有那么好。这样做的好处在于能够避免死锁和数据用户安全方面的问题。
Python有三种线程状态:Idle、Running、Failed GIL Acquire。曾经有人对GIL的性能影响做了两个测试。第一个测试案例是两个CPU密集线程,代码运行过程的大部分状态是Failed GIL Acquire,两个线程的运行没有达到双核的效果。
第二个案例是IO密集型的线程。仔细分析发现,IO没有达到想象的预期效果。所以IO密集型和CPU密集型同时存在时,IO密集型未必达到想要的运算速度,我们要区分好IO密集型和CPU密集型的服务。
▌(二)解释器
CPython要首先生成pcy字节码序列,之后才能被CPU理解,所以较慢。JAVA、.NET也有中间的翻译,但因为JAVA和.NET使用即时编辑(JIT),使用JIT可以检测哪些代码执行得比较多,意味着计算机应用程序需要重复做一件事情的时候它就会更快。