多任务

进程和线程的对比

关系对比

  1. 线程是依赖在进程里面的,没有进程就没有线程
  2. 一个进程默认提供一条线程进程可以创建多个线程

区别对比

  1. 进程之间共享全局变量
  2. 线程之间共享全局变量,但是要注意资源竞争的问题,解决办法:互斥锁或者线程同步
  3. 创建进程的资源开销比创建线程的资源开销要大
  4. 进程是操作系统资源分配的基本单位线程是CPU调度的基本单位
  5. 线程不能独立执行,必须依存在进程中
  6. 多进程开发比单进程开发稳定性强

优劣对比

进程优缺点:
  • 优点可以用多核
  • 缺点资源开销大
线程优缺点:
  • 优点资源开销小
  • 缺点不能使用多核

GIL

  • 定义全局解释器锁(解释器:IPythonCPythonPyPython等)

为什么线程不能使用多核?

  • 就是因为GILGIL保证同一时间,只有一个线程使用CPU
  • GIL不是Python的特性,只是CPython解释器的问题。历史遗留问题。

CIL锁什么时候释放?

  1. 在当前线程执行超时后会自动释放;
  2. 在当前线程执行阻塞操作时会自动释放(inputio/输入输出)
  3. 在当前执行完成时会释放

GIL的弊端

  1. GIL对计算密集型的程序会产生影响。因为计算密集型,需要占用资源。
  2. GIL的存在相当于始终在单线程运算,自然就慢了。
  3. IO密集型影响不大的原因在于IOinput/output,这两个词就表明程序的瓶颈在于输入所耗费的时间,线程大部分时间按在等待,所以它们是多个一起等(多线程)还是单个等(单线程)无所谓。

解决方案

  1. 更换解释器;
  2. 改为进程替代多线程
  3. 子线程使用C语言实现(绕过GIL,也体现了Python的胶水性,可以调用其它语言)。
重点:
  1. CPU密集型不适合多线程。
  2. I/O密集型适合多线程(GIL锁会释放)。