python多任务编程1 - 基本概念解析

当我们谈到多任务编程时,通常指的是在同一时间内同时执行多个任务,打个比方,你一边用着这浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务。这可以通过并发或并行来实现。

一、 理解核心概念

(一)并发与并行

并发是指通过快速切换任务的执行顺序,在短时间内交替执行多个任务,给人们以同时运行的感觉。但实际上,并没有真正同时运行,而是通过时间片轮转等机制进行切换。

并行是指真正意义上的同时执行多个任务,利用多核处理器或者分布式系统等技术将不同的任务分配到不同的计算资源中去。

当我们谈到进程、线程和协程时,通常是在讨论并发编程的概念。

(二)进程、线程 与协程概念

1. 进程(Process):

  • 进程是计算机中运行程序的实例。
  • 它有自己独立的内存空间、数据栈以及其他用于管理程序执行所需资源的系统结构信息。
  • 每个进程都被操作系统视为独立的实体,并且可以分配给不同的处理器核心来同时执行。
  • 进程之间相互隔离,彼此不能直接共享数据,只能通过特定机制进行通信。

一般计算机中,在哪里查看进程呢?

windows系统中,按下ctl+alt+del组合键,选择任务管理器(Task Manager),在弹出的任务管理器中,我们就能够看到一个个运行中的进程。

python多任务编程1 - 基本概念解析_第1张图片

在Linux系统中,可以用ps aux命令来查看所有运行的进程:

python多任务编程1 - 基本概念解析_第2张图片

或者用 ps -elf命令来查看

python多任务编程1 - 基本概念解析_第3张图片

2. 线程(Thread):

  • 线程是操作系统调度和执行任务最小单位。
  • 一个进程可以拥有多个线程,在同一时间内同时执行多个任务。
  • 线程共享相同的地址空间,即它们可以直接访问相同变量和数据结构。
  • 由于线程之间共享资源,在并发编写代码时需要注意对共享资源进行适当地加锁来保护数据完整性。

3. 协程(Coroutine):

  • 协程属于用户态轻量级线程,也称为微线程或纤维(Fiber),由用户控制调度而非操作系统内核进行调度切换。
  • 协作式多任务允许函数挂起和恢复执行状态,以便在不同的任务之间切换。
  • 协程通常用于解决高并发、高吞吐量和低延迟等问题。它可以减少线程上下文切换开销,并提供更加灵活的编程模型。

二、进程、线程、协程的主要特点、联系与区别

1.主要特点
  • 进程是运行程序的实例,拥有独立内存空间和系统资源。
  • 线程是进程中最小的执行单位,共享相同地址空间。
  • 协程是用户控制调度的轻量级线程,允许函数挂起和恢复执行状态。

2.主要联系

  • 进程、线程和协程都是用于实现并发编程的概念。
  • 它们都可以在同一时间内执行多个任务,提高程序的效率。
  • 进程、线程和协程都需要操作系统或用户进行调度以分配资源和控制执行顺序。

3.主要区别

  1. 资源开销:

    • 进程之间拥有独立的地址空间和系统资源,因此切换进程需要较大的开销。创建一个新进程需要复制当前进程的所有数据结构,并且涉及到上下文切换。
    • 线程共享相同的地址空间,因此切换线成本较低。创建一个新线只需为其分配栈空间即可,不必复制整个地址空间。
    • 协作式协议允许函数挂起和恢复执行状态,在协同代码块中切换非常轻量级。
  2. 通信与共享数据:

    • 进行之间不能直接共享数据,必须通过特定机制(如管道、共享内存等)进行通信。这样做是为了避免多个进程同时修改同一份数据而导致冲突。
    • 线成之前可以直接访问相同变量和数据结构,但需要注意线程安全问题。如果多个线程同时修改共享数据,可能会导致竞态条件等并发问题。
    • 协程可以在适当的时机挂起和恢复执行状态,因此协程之间可以通过传递消息来实现通信,并且不需要担心资源冲突。
  3. 调度方式:

    • 进程是由操作系统内核进行调度和切换的。进程之间的切换很耗费时间。
    • 线成由操作系统内核进行抢占式调度或用户自己控制进行协作式调度。
    • 协同代码块中的协程序是用户自己控制其运行与挂起,没有操作系统干涉。
  4. 编写复杂性:

  • 编写并发代码时,进程相对较为复杂。需要考虑进城间通信、同步、互斥等问题。
  • 编写线成代码比编写进程代码简单一些,但仍需小心处理共享数据和加锁机制
  • 协程提供了更灵活、易于理解以及减少上下文切换开销的编码模型

总结:

  • 进程开销大,在不同地址空间中运行独立任务;
  • 线成共享资源,在相同地址空间中执行任务;
  • 协程轻量级且高效,由用户控制调度与切换。

 三、多任务与CPU内核数量的关系

    1.单核CPU是怎么解决多任务的?

    单核:意味着同一时刻只能执行一件事情,   操作系统轮流让各任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01,再切换到任务3,    执行0.01秒。。。。。这样反复的执行下去,每个任务都是交替执行的,但是由于CPU的执行速度快,我们感觉就像是所有任务都在同时执行一样,这就是所谓的 “时间片轮换” 方法 。

    2.多核CPU与多进程的关系

      大部分谈多进程,都会提多核cpu,这给初学者一个错觉。就是只有多核cpu才能够多进程。我就这样,因为这个错觉,认为自己的电脑2核,只能处理两个进程,进而觉得多进程没有实际作用,而放弃使用多进程。可实际上cpu核数和多进程没有必然联系。LINUX刚出生时,没有多核CPU,但一样不影响他的多任务特性,这就说明单核cpu也可以处理多进程。没有多核进程只是更高级的线程,可以理解成对线程的包装和组合。

    cpu在处理线程和进程时,都是用切换来实现。只是多核就不用切换频繁,效率更高。当CPU的核数大于任务数量时,可以实现真的多任务--并行;而CPU的核数小于任务数量 ,实现的只是另一种多任务--并发。真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动      把很多任务轮流调度到每个核心上执行。

         借用知乎上的一个图,希望能给有幸读到这里的朋友解惑。(原文链接:Python 多进程multiprocessing - 知乎)

python多任务编程1 - 基本概念解析_第4张图片

以上是关于多任务编程方面的预备知识,有了这些知识的铺垫,后面学习python的多任务编程,就会有基本的概念,不致于一头雾水了。

下一个内容,我们将一起学习multiprocessing模块,掌握python多进程编程的技巧。

写博不易,如果以上内容对你有帮助,麻烦点赞、收藏,这就是对我们最好的鼓励,你的鼓励是我们前进的最大动力!!

你可能感兴趣的:(python中高级编程技巧,java,数据库,服务器,python)