Question
Contents
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带来的限制?#
多线程 threading 机制依然是有用的,用于IO密集型计算
因为在I/O(read,write,send,recv,etc)期间,线程会释放GI,实现CPU和IO的并行。 因此多线程用于IO密集型计算依然是可以大幅提升速度。但是多线程用于CPU密集型计算时,只会更加拖慢速度。
使用multiprocessing的多进程机制实现并行计算,利用多核CPU优势。
为了应对GIL的问题,Python提供了multiprocessing。