Question#

什么是CPU密集型计算 / IO密集型计算?#

  • CPU密集型(CPU_bound): CPU密集型也叫计算密集型,是指I/O在很短时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高。

    例如:压缩与解压缩,加密解密,正则表达式搜索

  • IO密集型(I/O bound): IO密集型是指的是系统运作大部分的状况是在CPU在等I/O(硬盘/内存)的读/写操作,CPU占用率仍然较低。

    例如: 文件处理程序,网络爬虫程序,读写数据库程序

Python速度慢的两大原因#

相比于C/C++/JAV,Python确实慢,在一些特殊场景下,Python比C++慢100~200倍。 由于速度慢的原因,很多公司的基础架构代码依然用C/C++开发。比如各大公司阿里/腾讯/快手的推荐引擎,搜索引擎,存储引擎等底层对性能要求高的模块。

  • 原因一: 动态性语言:边解释边执行。

  • 原因二: GIL:无法利用多核CPU并发执行。

GIL是什么?#

全局解释器锁(Global Interpreter Lock,缩写GIL,是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。 即便在多核心处理器上,使用GIL的解释器也只允许同一时间执行一个线程。

由于GIL的存在,即使电脑有多核CP,单个时刻也只能使用1个,相比于并发加速的C++/JAVA所以慢。

为什么有GIL这个东西?#

简而言之:Python设计之初,为了规避并发问题引入了GIL,现在想去除却去不掉了。

  • 引入是为了解决多线程之间数据完整性和状态同步问题

    • 原因详解:Python中对象的管理,是使用引用计数器进行的,引用数为0则释放对象。

    • GIL确实有好处:简化了Python对共享资源的管理。

怎样规避GIL带来的限制?#

  1. 多线程 threading 机制依然是有用的,用于IO密集型计算

    因为在I/O(read,write,send,recv,etc)期间,线程会释放GI,实现CPU和IO的并行。 因此多线程用于IO密集型计算依然是可以大幅提升速度。但是多线程用于CPU密集型计算时,只会更加拖慢速度。

  2. 使用multiprocessing的多进程机制实现并行计算,利用多核CPU优势。

    为了应对GIL的问题,Python提供了multiprocessing。