快速理解进程、线程、协程的概念,它们的区别和共同点,以及应用场景。

一、进程、线程、协程的概念

1、进程:

教科书上最经典的一句话解释:——进程是资源分配的最小单位

实质上的理解:——先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。进程的生命周期有调入,执行,保存的过程。

2、线程:

教科书上最经典的一句话解释:——线程是CPU调度的最小单位

实质上理解:——一个应用程序的执行可能有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块;这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,单核任务中划分更为细小的CPU时间段

3、协程:

教科书上最经典的一句话解释:——协程是线程的一种表现形式。

实质上理解:——协程又称微线程。在单线程上执行的多个任务,用函数切换,开销极小。

深入理解:子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断

二、进程、线程、协程的区别

1、多进程/多线程
    共同点 :表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。

区别:

进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。

线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小。共享意味着竞争,导致数据不安全,为了保护内存空间的数据安全,引入"互斥锁"。一个线程在访问内存空间的时候,其他线程不允许访问,必须等待之前的线程访问结束,才能使用这个内存空间。

互斥锁:一种安全有序的让多个线程访问内存空间的机制。

python的多线程:由于有GIL锁的存在,一个线程需要执行任务,必须获取GIL,好处:直接杜绝了多个线程访问内存空间的安全问题。坏处:Python的多线程不是真正多线程,不能充分利用多核CPU的资源。

2、多线程和协程之间的共同点和区别:

共同点:

都是并发操作,多线程同一时间点只能有一个线程在执行,协程同一时间点只能有一个任务在执行;

不同点:

多线程,是在I/O阻塞时通过切换线程来达到并发的效果,在什么情况下做线程切换是由操作系统来决定的,开发者不用操心,但会造成竞争条件。协程是用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。

三、应用场景
  如果是 I/O 密集型,且 I/O 请求比较耗时的话,使用协程。
    函数切换,占用资源少
  如果是 I/O 密集型,且 I/O 请求比较快的话,使用多线程。
    由操作系统切换,占用资源大,越快处理完越好
  如果是 计算 密集型,考虑可以使用多核 CPU,使用多进程。
    进程之间资源不共享,还可以用到多个CPU,如果使用线程的话,还要考虑到数据的安全性,使用互斥锁。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值