目录

  • 前言
  • 一、线程与进程
  • 1.什么是线程
  • 2.什么是进程
  • 3.进程与线程的关系
  • 4.总结
  • 5.CPU密集型与IO密集型
  • 二、Python的多线程和多进程
  • 1.GIL(Global Interpreter Lock ,全局解释器锁)
  • 总结


前言

依托阿里云服务器,通过Python的flask这一web框架实现后台用户高并发访问。本文用到Python多线程和多进程相关知识。

一、线程与进程

1.什么是线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。

2.什么是进程

一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)

一个进程有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变量、优先级类、最小和最大的工作空间(内存空间),还要有至少一个线程。

3.进程与线程的关系

1.系统由一个个进程组成,每个进程包含代码段、数据段、堆空间和栈空间,以及操作系统共享部分 ,有等待,就绪和运行三种状态;
2.一个进程可以包含多个线程,线程之间共享进程的资源(文件描述符、全局变量、堆空间等),寄存器变量和栈空间等是线程私有的;
3.操作系统中一个进程挂掉不会影响其他进程,如果一个进程中的某个线程挂掉而且OS对线程的支持是多对一模型,那么会导致当前进程挂掉;
4.如果CPU和系统支持多线程与多进程,多个进程并行执行的同时,每个进程中的线程也可以并行执行,这样才能最大限度的榨取硬件的性能;

4.总结

1.同一个进程中的线程共享同一内存空间,但是进程之间是独立的。
2.同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。
3.对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。
4.线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。
5.同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。
6.创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。
7.一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。
8.线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)

5.CPU密集型与IO密集型

1.CPU密集型(各种循环处理、计算等等):程序需要占用CPU进行大量的运算和数据处理;

2.I/O密集型(文件处理、网络爬虫等涉及文件读写的操作):程序中需要频繁的进行I/O操作;例如网络中socket数据传输和读取等;

二、Python的多线程和多进程

1.GIL(Global Interpreter Lock ,全局解释器锁)

GIL(Global Interpreter Lock 全局解释器锁),这是目前占统治地位的python解释器CPython中为了保证数据安全所实现的一种锁。不管进程中有多少线程,只有拿到了GIL锁的线程才可以在CPU上运行,即使是多核处理器。对一个进程而言,不管有多少线程,任一时刻,只会有一个线程在执行。对于CPU密集型的线程,其效率不仅仅不高,反而有可能比较低。python多线程比较适用于IO密集型的程序。对于的确需要并行运行的程序,可以考虑多进程。

况且,多线程对锁的争夺,CPU对线程的调度,线程之间的切换等均会有时间开销。
python下的多线程对CPU密集型代码并不友好。
python的多线程对IO密集型代码比较友好。

总结

由于python多线程并不是并行执行,因此较适合于I/O密集型程序,多进程并行执行适用于CPU密集型程序。python下想要充分利用多核CPU,就用多进程。因为每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。