多任务

1. 多任务的概念:

  多任务是指在同一时间内执行多个任务,

2. 多任务的执行方式: 并发并行

  并发: 在一段时间内交替去执行任务。 对于单核cpu处理多任务,操作系统轮流让各个软件交替执行,

  并行: 在同一时间执行软件。 多核cpu是并行的执行多任务,始终有多个软件一起执行。

3. 进程:  进程是实现多任务的一种方式

  概念:  一个正在运行的程序或者软件就是一个进程, 它是操作系统进行资源分配的基本单位

  注意:  一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。

  特点:  a. 进程之间不共享全局变量  b. 主进程会等待所有的子进程执行结束再结束

4. 线程: 线程是实现多任务的另外一种方式。

  概念: 线程是cpu调度的基本单位,每个进程至少都有一个线程

  (线程在执行时有什么特点?)

  特点: a. 线程之间执行是无序

      b. 主线程会等待所有的子线程执行结束再结束

                c. 线程之间共享全局变量

      d.线程之间共享全局变量数据出现错误问题

  注意: 全局变量数据错误的解决办法: 线程等待(join)  互斥锁()  

5. 线程等待: join    多任务 ==> 单任务

    互斥锁: 对共享数据进行锁定,保证同一时刻只能有一个线程去操作。为保证共享数据操作的完整性,threading模块给我们提供了一个Lock类,我们把这个类创建的对象对应于一个可称为"互斥锁" 的标记, 这个标记用来保证在任一时刻,只能有一个线程访问该对象.

 互斥锁应用: 解决多线程中共享数据的资源竞争问题

 互斥锁缺点: 阻止了多线程并发执行,含锁的代码只能以单线程模式执行,效率就大大地下降了; 容易出现死锁问题;

6. 死锁问题:(什么是死锁?怎样避免死锁?)

  死锁: 两个或多个线程中,如果每个线程锁定了其他线程试图锁定的资源,此时会造成这些线程永久阻塞.

  避免死锁: 在设计程序时, 尽量减少资源竞争, 无法避免资源竞争时, 各个线程及时释放锁定的资源.

   拓展思考: 乐观锁?

7. GIL锁的理解(什么是GIL,怎么解决GIL?)

  python的原始解释器CPython中存在着GIL(Global Interpreter Lock, 全局解释器锁),因此在执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数到达一定数目时才会释放GIL

  怎么解决GIL:

  1、能用进程(可以并行)不用线程。
  2、高效的代码(多线程执行的任务,想并行的)使用c,c++来编写

   

原文地址:https://www.cnblogs.com/yqyn-study/p/13440198.html