[Python]多任务 - 进程、线程、协程

[Python]多任务 - 进程、线程、协程

1. 多进程多线程和协程的创建方式

  1. 进程创建

    • 通过multiprocessing模块的Process类创建

    • 自定义一个继承于Process的类

  2. 线程创建

    • 通过threading模块的Thread类创建

    • 自定义一个继承于Thread的类

  3. 协程创建

    • 待补充

2. 多进程和多线程的方法及含义

  1. 多进程(multiprocessing)
    • is_alive():返回进程是否是激活的。
    • join([timeout]):阻塞进程,直到进程执行完、超时或终止
    • run():代表进程执行的任务函数,可被重写。
    • start():激活进程。
    • terminate():终止进程。
  2. 多线程(threading)
    • run():用来表示线程活动的方法。
    • start():启动线程。
    • join([time]):阻塞线程,直到线程执行完、超时或终止。
    • isAlive():返回线程是否是激活的。
    • getName():返回线程名。
    • setName():设置线程名。

3. 多进程和多线程对共享数据的访问机制

  1. 进程
    • 共享机制:进程与进程之间,首先会在内存中创建共享内存,然后连接到共享内存进行操作。若进行读操作可直接访问共享内存;若进行写操作则会执行写时复制操作,在Linux中父进程会fork()出一份子进程。
    • 同步机制:
      • Semaphore:信号量,控制对共享资源的访问,即同一时刻的并发进程数。
      • Lock:互斥锁,某一时刻只有一个进程可以访问共享数据,避免数据错乱。
      • Event:事件,等待事件发生(可设置超时时间),可通过set()方法唤醒,被唤醒后可以通过clear()方法清除状态重新等待。
  2. 线程
    • 共享机制:线程与线程之间,因为属于同一进程,所以可以直接访问进程中的共享资源进行读与写的操作。
    • 同步机制:
      • Semaphore:信号量,控制对共享资源的访问,即同一时刻的并发线程数。
      • Lock:互斥锁,某一时刻只有一个线程可以访问进程内的共享数据,防止数据修改错乱。
      • Event:事件,一个线程发出信号,其他一个或多个线程等待唤醒。
      • Condition:条件对象,一个线程停下来,等待另一个线程满足某个条件之后通知(notify)再继续运行。

4. 多进程和多线程间的通信机制

  1. 多进程
    • Queue:队列,进程之间可以通过Queue来进行数据传递,通过put()方法插入数据,get()方法读取并删除一个数据。
    • Semaphore:信号量,控制对共享资源的访问,即同一时刻的并发线程数。
  2. 多线程
    • queue:队列
      • Queue:先进先出(FIFO)队列。
      • LifoQueue:后进先出(LIFO)队列。
      • PriorityQueue:优先级队列。

5. 进程池和线程池的创建及使用

  1. 进程池 Pool
    • 作用:一个存放进程的容器,可重复调度里面的进程。初始化Pool的时候可以指定一个最大进程数,如果池中的进程数没达到最大值,会创建新进程用来执行请求;如果达池中的进程数达到了最大值,则等待池中有进程结束之后,再用来执行新的任务。
  2. 线程池 ThreadPool
    • 作用:将任务添加到线程池里,线程池会指定一个空闲的线程去执行任务,若超过线程池的最大线程数,则任务需要等待有新的空闲线程后才会被执行。

6. 进程和线程和协程之间的区别

  1. 进程是资源分配的基本单位。
  2. 线程是操作系统调度的单位。
  3. 进程切换需要的资源很大,效率很低。
  4. 线程切换需要的资源一般,效率一般(在不考虑GIL全局解释锁的情况下)。
  5. 协程切换任务资源很小,效率高。
  6. 多进程、多线程根据CPU核数不一样可能是并行的,但是协程是在一个线程中所以是并发的。

7. 多进程和多线程的各自适用的场景

  1. 线程和协程推荐在IO密集型的任务(比如网络IO场景)中使用,而在CPU密集型的任务中,表现较差。
  2. 对于CPU密集型的任务,则需要多个进程,绕开GIL的限制,利用所有可用的CPU核心,提高效率。
  3. 所以大并发下的最佳实践就是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
posted @ 2020-12-14 21:07  SkyBiuBiu  阅读(172)  评论(0编辑  收藏  举报