1.三者的概念:
(1)进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
(2)线程:有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
(3)协程(coroutine):又称微线程,纤程,也是一种程序组件。与子例程一样。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自 Simula 和 Modula-2 语言,但也有其他语言支持。协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
2.三者的对比
名称 | 占用资源 | 数据独立性 | 运行 | 关系 | 切换消耗资源 |
---|---|---|---|---|---|
进程 | 较多 | 独立数据 | 可多核 | 进程包含线程 | 较多 |
线程 | 较少 | 共享数据 | 不可多核(存在GIL) | 线程存在于进程,包含协程 | 较少 |
协程 | 最少 | 共享数据 | 不可多核 | 协程存在于线程 | 最少 |
(1)进程与线程的区别
1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间。
2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
3) 线程是处理器调度的基本单位,但进程不是。
4)二者均可并发执行。
5)每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
(2)协程多与线程的区别
1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。
2) 线程进程都是同步机制,而协程则是异步。
3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
总结:
IO密集型一般使用多线程或者多进程,CPU密集型一般使用多进程,强调非阻塞异步并发的一般都是使用协程,当然有时候也是需要多进程线程池结合的,或者是其他组合方式。