文章目录

  • ​​1.python程序提速大的方法​​
  • ​​2.Python对并发编程的支持​​
  • ​​3.CPU密集型计算、IO密集型计算?​​
  • ​​4.多线程、多进程、多协程的对比​​
  • ​​5.Python速度慢的两大原因​​
  • ​​6.GIL​​

1.python程序提速大的方法

  • python多线程并发 VS python多CPU并行

2.Python对并发编程的支持

  • 多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成
  • 多进程:multiprocessing,利用多核CPU的能力,真正的并行执行任务
  • 异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行
  • 使用Lock对资源加锁,防止冲突访问
  • 使用Queue实现不同线程/进程之间的数据通信,实现生产者-消费者模式
  • 使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果
  • 使用subprocess启动外部程序的进程,并进行输入输出交互
  • Python并发编程有三种方式
    多线程Thread、多进程Process、多协程Coroutine

3.CPU密集型计算、IO密集型计算?

  • CPU密集型(CPU-bound):Bound表示受限制的意思;
    CPU密集型(CPU-bound):
    Bound表示受限制的意思
    (1)CPU密集型也叫计算密集型,是指I/O在很短的时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高
    (2)例如:压缩解压缩、加密解密、正则表达式搜索
  • IO密集型(I/O bound):
    (1)IO密集型指的是系统运作大部分的状况是CPU在等I/O (硬盘/内存/网络) 的读/写操作,CPU占用率仍然较低。
    (2)例如:文件处理程序、网络爬虫程序、读写数据库程序

4.多线程、多进程、多协程的对比

(P1-P3)并发编程引言_多核

  • 怎样根据任务选择对应技术?

5.Python速度慢的两大原因

  • Python 速度慢的原因1
    动态类型语言
    边解释边执行
    由于速度慢的原因,很多公司的基础架构代码依然用C/C++开发:从源码翻译成机器码,机器码速度快,比如各大公司阿里/腾讯/快手的推荐引擎、搜索引擎、存储引擎等底层对性能要求高的模块
  • Python 速度慢的原因2
    GIL
    导致无法利用多核CPU并发执行

6.GIL

  • 全局解释器锁(英语:Global Interpreter Lock,缩写GIL)
    是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。
    即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。
  • 由于GIL的存在,即使电脑有多核CPU,单个时刻也只能使用1个,相比并发加速的C++/JAVA所以慢,C++/JAVA的多线程程序会分配到多核上去执行
  • 为什么有GIL这个东西?
    为了解决多线程之间数据完整性和状态同步问题
    GIL确实有好处:简化了Python对共享资源的管理;
    原因如下:Python中对象的管理,是使用引用计数器进行的,引用数为0则释放对象
    开始:线程A和线程B都引用了对象obj,obj.ref_num = 2,线程A和B都想撤销对obj的引用
  • (P1-P3)并发编程引言_多核_02

  • 怎样规避GIL带来的限制?
    (1)多线程 threading 机制依然是有用的,用于IO密集型计算
    因为在 I/O (read,write,send,recv,etc.)期间,线程会释放GIL,实现CPU和IO的并行,因此多线程用于IO密集型计算依然可以大幅提升速度;
    但是多线程用于CPU密集型计算时,只会更加拖慢速度;
    (2)使用multiprocessing 的多进程机制实现并行计算、利用多核CPU优势
    为了应对GIL的问题,Python提供了multiprocessing
  • 参考:​​链接​