码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-15 22:42:33      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:实现   函数调用   完成   互斥锁   占用   计算   pytho   调用   协程   

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

  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,如果使用线程的话,还要考虑到数据的安全性,使用互斥锁。

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

标签:实现   函数调用   完成   互斥锁   占用   计算   pytho   调用   协程   

原文地址:https://www.cnblogs.com/youhongliang/p/12198897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!