进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。

线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。

协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

什么是多线程竞争?
线程是非独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:
数据几乎同步会被多个线程占用,造成数据混乱 ,即所谓的线程不安全
那么怎么解决多线程竞争问题?-- 锁。
锁的好处:
确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下的原子操作问题。

锁的坏处:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了,锁的致命问题:死锁

多进程
在Linux系统下,使用os.fork(), 调用一次,返回两次,操作系统自动把当前进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。子进程永远返回0,父进程返回子进程的ID。经过这样做,父进程就能fork出很多子进程,并可以记录下子进程的ID号了,子进程可以通过getppid()来获取父进程ID。fork()仅在Unix/Linux下使用,windows则不行。 所以,在Python中,存在一个跨平台的包mutiprocessing,通过引入包中的Process类,就可以创建多进程程序了,可以创建一个进程p=Process(target=func,args=(*,)),然后利用p.start()及p.join()来执行了。以上的join()方法可以等待子进程结束后才往下执行,通常用于进程间同步。 另外,可以用进程池的方式,例如p=Pool(n),然后p.apply_async(func,args),这里可以使用n种不同的参数传入,建立不同的进程。用这种方式时,在调用join()方法前,要先调用close()方法,使得不能再添加新进程。 mutiprocessing包里提供了Queue、Pipe等多种进程间通信的方法。可以直接引入Queue类,然后实例化一个对象。则不同的进程可以使用put方法发信息,同时可以使用get方法取信息。

多线程
多个任务可以创建多个进程来完成,同时也可以创建多个线程来完成,线程是操作系统直接的执行单元。 Python含有threading这个高级模块,要启动一个线程,就是把一个函数传出并创建Thread实例,然后调用start()方法开始执行,例如t=threading.Thread(target=func,name=*),注意这里的name属性,它是给线程命名的,缺省值为Thread-1···。要注意的是,刚才说了,任何一个进程都含有一个线程,而这个主线程则执行着我们编写的程序,可以调用threading.current_thread().name来查看它,它的名字就叫MainThread。 在多线程编程中,有一个最大的问题就在于进程内的资源被各个线程所共享,进程内任何变量都可以被任何一个线程修改,因此,线程之间若去修改同一个变量,则可能导致程序Bug。所以,引入了锁机制。 当某个线程去修改某个变量时,可以在变量所在的方法内加一把锁,使得其他线程不能同时执行该方法,只有释放了锁后,其他线程才能去获得锁并获得修改权。创建一个锁是通过lock=threading.Lock()来实现的,可以使用try···finally···语句,在try之前使用lock.acquire()获得锁,然后在try语句里面修改变量,然后在finally语句里加lock.release()来保证锁一定被释放,避免成为一个死锁。
区别于联系
多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源,并且,操作系统对进程的总数会有一定的限制,若进程过多,操作系统调度都会存在问题,会造成假死状态。
多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩溃,因为它们共享了进程的内存资源池。 对于任务数来说,无论是多进程或者多线程,都不能太多。因为操作系统在切换任务时,会有一系列的保护现场措施,这要花费相当的系统资源,若任务过多,则大部分资源都被用做干这些了,结果就是所有任务都做不好,所以操作系统会限制进程的数量。 另外,考虑计算密集型及IO密集型应用程序。对于计算密集型,多任务势必造成资源浪费。对于IO密集型,因为IO速度远低于CPU计算速度,所以使用多任务方式可以大大增大程序运行效率。

协程,又称微线程 英文名Coroutine。
协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。
在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

协程 -> 微线程 在不开辟线程的情况下 完成多个任务"交替执行" 网络爬虫
协程是一个特殊的生成器
yield 返回值 生成器
yield 协程(没返回值就是协程)
greenlet已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent
其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。
由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

简单总结

  1. 进程是资源分配的单位

  2. 线程是操作系统调度的单位

  3. 进程切换需要的资源很最大,效率很低

  4. 线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)

  5. 协程切换任务资源很小,效率高

  6. 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发

Python中多线程多进程与协程的区别相关推荐

  1. python:一文搞懂多线程,多进程,异步协程的使用场景

    本文将使用场景化为案例,将单线程,多线程,多进程,异步协程的速度进行对比 对比速度时,   >表示 速度快于  >>表示速度远快于  =表示速度差不多 >>>> ...

  2. python多线程多进程多协程_python 多进程、多线程、协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  3. python中IO多路复用、协程

    一.IO多路复用 IO多路复用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写) import socket def get_data(key):client ...

  4. python协程和线程区别_python中的线程和协程之间有什么区别

    一.首先我们来了解一下线程和协程的概念1.线程线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源( ...

  5. 简要说明__python3中的进程/线程/协程

    多任务可以充分利用系统资源,极大提升程序运行效率,多任务的实现往往与 多线程,多进程,多协程有关 稳定性: 进程 > 线程 > 协程 系统资源占用量:进程 > 线程 > 协程 ...

  6. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  7. Python高并发爬虫测评(2): 多进程, 多线程和异步协程哪个快?

    在Python爬虫下一代网络请求库httpx和parsel解析库测评一文中我们对比了requests的同步爬虫和httpx的异步协程爬虫爬取链家二手房信息所花的时间(如下所示:一共580条记录),结果 ...

  8. Python中的线程、进程、协程以及区别

    进程,是执行中的计算机程序.也就是说,每个代码在执行的时候,首先本身即是一个进程.一个进程具有:就绪,运行,中断,僵死,结束等状态(不同操作系统不一样). 运行中每个进程都拥有自己的地址空间.内存.数 ...

  9. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO

    Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...

最新文章

  1. Android优化五:布局优化
  2. Rime在linux下面的安装-还没写完
  3. SAP HTML5 Application Repository
  4. leetcode 844. 比较含退格的字符串
  5. 【Makefile由浅入深完全学习记录4】变量和不同的赋值方式
  6. 【计蒜客 - 2019南昌邀请赛网络赛 - M】Subsequence(字典树,dp预处理)
  7. K8S+KubeSphere之Helm安装
  8. 117_PowerQuery使用ODBC访问带密码的Access
  9. 05-01 docker 介绍
  10. redis13---事务处理。
  11. DIY专门制作PCB的雕刻机--所需软件
  12. 通信网络基础知识复习
  13. 明小子动力上传拿webshell.zip
  14. 单点登录原理及实现方式
  15. ubuntu ssh远程连接
  16. Java操作word模板插入图片
  17. 关于电的计算机公式,关于电的计算公式 所有注意,是所有!什么功率、电流、电阻、.对不起,我要的是全部,而且不要光是字母公式,而且请注明单位...
  18. html 隐藏广告代码,Javascript实现关闭广告实现删除广告的效果
  19. Win10系统重装教程(纯净版)
  20. Pr:旧版标题设计器

热门文章

  1. junit 单元测试 规范
  2. Visual C#实现Windows信使服务
  3. 二维小波变换在图像降噪与压缩中的应用
  4. Window应急响应(六 ARP病毒)
  5. 【配置网卡简单详解】
  6. java xfire下载_xFire全部jar包下载_xFire全部jar包官方下载-太平洋下载中心
  7. java cardlayout性能_java中的CardLayout的运用
  8. c#垂直投影法_第五套人民币10元和5元纸币采用了固定花卉水印和白水印,其中,白水印的特点是...
  9. Android activeandroid 唯一约束
  10. JAXConf刚刚超过一周!