Python多线程学习笔记

Python多线程学习笔记

进程 -> 线程 -> 协程

线程的介绍

重要性

◆ 跳槽、面试、决定薪资高度

◆ 解决”效率”问题

◆ Python的GIL导致的系列问题

◆ 通常会混合使用(多进程 + 协程)

进程

◆ 是一个执行中的程序

◆ 每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据

◆ 操作系统管理其上所有进程的执行,并为这些进程合理地分配时间

◆ 进程也可通过派生(fork或者spawm)新的进程来执行其他任务

PS:fork在windows上的支持不是太好,代码只可能在Linux上运行的话,建议用fork。

线程

◆ 在同一个进程下执行,并共享相同的上下文

◆ 一个进程中的各个线程与主线程共享同一片数据空间

◆ 线程包括开始、执行顺序和结束三部分

◆ 它可以被抢占(中断)和临时挂起(也称为睡眠)——让步

◆ 一般是以并发方式执行

并发

◆ 不等同于并行处理

◆ 是一种属性——程序、算法或问题的属性

◆ 并行只是并发问题的可能方法之一

◆ 如果两个事件互不影响,则两个事件是并发的

多核的利用及GIL概念

对多核的利用

◆ 单核CPU系统中,不存在真正的并发

◆ GIL —— 全局解释器锁

◆ GIL只是强制在任何时候只有一个线程可以执行Python代码

◆ I/O密集型应用与CPU密集型应用 (架构师和后台开发需要对此有更深的了解)

Python对I/O密集型应用会有比较强大的优势,在CPU密集型应用就发挥不出这样的优势了。而为了弥补CPU密集型应用的缺陷,可以进行C或者C++的扩展。

GIL执行顺序

  1. 设置GIL

  2. 切换进一个线程去运行

  3. 执行下面操作之一:

    ◆ 指定数量的字节码指令

    ◆ 线程主动让出控制权(可以调用time.sleep(0)来完成)

  4. 把线程设置回睡眠状态(切换出线程)

  5. 解锁GIL

  6. 重复上述步骤

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×