Python 进程线程协程

列表内容:

  • 进程定义
  • 资源使用情况,资源是否共享,效率是否高
  • 使用场景 & 使用样例
  • 优势 & 缺点

术语

进程线程协程存在的原因:

背景说明:

  • 为了提高程序性能
  • 由于时间切片的存在,将时间分割为时间切片,每个时间切片单个 CPU 执行不同程序

多进程、多线程根据 cpu 核数不一样可能是并行的 也可能是并发的。协程的本质就是使用当前进程在不同的函数代码中切换执行,可以理解为并行。 协程是一个用户层面的概念,不同协程的模型实现可能是单线程 也可能是多线程

进程

进程术语说明

-

  • 资源说明:
  • 进程就是一个运行中的程序,是系统的资源分配和运行调度的一个基本单位。由于 cpu 的多任务时间片轮转工作机制,所以同一时刻内一个 cpu 内核只能有一个进程在执行
  • 概念:
    • 进程是资源分配的单位
  • 资源说明:
    • 进程切换需要的资源很最大,效率很低
    • 在多进程中,每个进程中所有数据(包括全局变量)都各自拥有一份,互不影响。
  • 使用场景:
    • 多进程适用于 CPU 密集型的场景

线程

  • 线程是操作系统调度的单位
  • 线程切换需要的资源一般,效率一般
  • 资源说明:
    • 在多线程中,数据在线程之间是共享的,所以多个线程可能会同时对数据文件进行读取修改,这样一来就无法保证了数据的安全性,所以对数据操作时还需要引入锁的概念。
  • 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,与其他线程共享进程所拥有的全部资源。一个进程至少包含一个线程

协程

  • 协程切换任务资源很小,效率高
  • 资源说明
    • 协程本质上是一个单线程,协程间可以中断去执行另外一个程序,执行完后再返回,由于处在一个线程内,所以不存在读写冲突,控制共享资源不用加锁,更不需用进行线程切换。
  • 协程是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。
    python 下常用的协程包有 yield,gevent,以及出现在 python3.4 以后的 async\await
    yield 示例代码(输出斐波那契數列前 N 个数):

“协程是一种用户级的轻量级线程”,应用场景多用于 IO 密集型, 他有高并发的特点, 不适用于 CPU 密集型的场景。

协程主要是利用迭代器来实现多线程的效果,

相对于多线程的优势在于:

  1. 减少系统调用(切换线程需要系统级调用)的开销,
  2. 多协程运行于单线程中, 所以内存安全的, 不会产生脏数据, 也不会去竞争 GIL.
  3. 然后多进程+多协程可以达到充分利用 cpu 的效果

协程的关键在于
yield 迭代器(generator)
send, yield 是把迭代器里的值返回出来, send 就是把值写进迭代器,
yield from, “yield from iterable 本质上等于 for item in iterable: yield item 的缩写版”, yield from 的出现是为了解决 嵌套的迭代器问题
asyncio, 一个基于事件循环的异步 I/O 模块, 类似的有 gevent, tornado 等, 在 asyncio 中, yield from 就发挥了很大的作用, 因为有大量的消息需要隔层传递. 在 asyncio 中, 主要这样几个概念, 首先有一个 event_loop 事件循环, 它是一个无限循环程序

https://www.jianshu.com/p/90ada937c90d

asyncio 主要流程应该是: 定义协程函数, 如果有耗时的操作用 await 挂起 —> 创建一个事件循环 —-> 创建 task —-> 绑定回调 —> 注册 task —> 从 task 的 result 获取结果.
搭配进程可以开多条 事件循环, 多核的并行操作.
搭配线程还可以动态的注册 task.
搭配 aiohttp 进行异步的 http 请求.

并行:多个 CPU 核心,不同的程序就分配给不同的 CPU 来运行。可以让多个程序同时执行
并发:单个 CPU 核心,在一个时间切片里一次只能运行一个程序,如果需要运行多个程序,则串行执行

批处理:指一个处理完了另一个再处理;

进程:即每个程序的执行的代码(全部流程),加上执行现场(当前执行场景);

并发:因为多个程序在一个 CPU 上不断切换,人类看起来如同程序在同时执行,这就是并发;
并行:即多个程序同时在多个 CPU 上执行,就是并行;

线程:进程内部,有多个执行流程(加上每个流程的执行场景),这个流程就是线程;

协程:即线程内部,转换运行控制权;

进程是:一个 CPU 情况下,多个程序分别使用机器资源(CPU 或硬盘等)的概念;
线程是:一个进程情况下,多个执行流程(即线程)分别使用分配给该进程的机器资源的概念;
协程是:一个线程情况下,多个执行流程(即协程)由线程控制,分别使用分配给该线程的机器资源的概念;

进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源;
线程是处理器调度的基本单位;
协程可以理解为线程内部调度的基本单位。
协程的优势在于:处理器调度(即线程)会有很大的场景切换消耗,而对处理器来说,协程属于同一个调度,切换消耗较小。
本质就是各种抽象,用于提升小路,不用纠结太深,只要可以更好的解决问题提升效率即可。

实现方式

进程、线程、协程使用样例。

进程实现

mutiprocess

线程实现

threading

协程实现

gevent

附件

参考链接

https://juejin.im/post/5b7bd540e51d4538a67a80e3
https://zhuanlan.zhihu.com/p/30980478
https://www.jb51.net/article/95971.htm

Python 之路[9] - 进程、线程、携程篇

相关资源

TODO Python异步编程 asyncio 之路