进程 vs 线程、协程

进程(process)

在操作系统中,进程是一个正在执行的程序实例。进程是操作系统为了完成某个任务而创建的,它拥有独立的地址空间、文件句柄和系统资源。

进程是资源分配的最小单位,因此可以说进程是最小的资源分配单位。每个进程都有自己的程序计数器、堆栈和数据段等。

进程之间是相互独立的,它们有各自的执行状态、内存空间和系统资源。进程通过进程间通信(如管道、消息队列、共享内存等机制)进行数据交换和协调。进程由操作系统进行管理和调度,可以同时并发运行多个进程。

线程(thread)

线程是程序执行的最小单位。一个进程可以包含多个线程,每个线程都拥有自己的栈空间和程序计数器,但共享进程的地址空间和系统资源。

线程可以并发执行,共享数据,并且能够更高效地利用多核处理器的并行能力。

操作系统通过调度线程来实现并发执行。

python中因为有【GIL锁】的存在,所以【线程】效率不高。推荐使用【协程】。

协程(Coroutine)

是一种轻量级的用户态线程,也叫做微线程,实现的是非抢占式的调度,通常可以用协程来解决IO密集型任务,比如文件处理、网络爬虫等。

一个进程包含多个线程,一个线程包含多个协程。

目前官方推荐的实现协程的方式是 async 和await关键字

import asyncio

async def ccc():
    await asyncio.sleep(1)
    return 'Done  '
    
    
asyncio.run(ccc())

这个被 async 修饰的函数 ccc 就是一个协程函数,该函数会返回一个协程对象。
凡是耗时操作,需要使用await 关键词修饰
进程和线程,控制权在于操作系统。

操作系统通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,重新开始的地方不可预期,开发者无法精确控制它们。

协程,控制权在用户,用户想让程序怎么跑就怎么跑

协程(Coroutine)是一种轻量级的用户态线程,实现的是非抢占式的调度,由当前协程切换到其他协程由当前协程来控制。

目前的协程框架一般都是设计成 1:N 模式。所谓 1:N 就是一个线程作为一个容器里面放置多个协程。

那么谁来适时的切换这些协程?

答案是由协程自己主动让出 CPU(本质上是程序员编的代码),也就是每个协程池里面有一个调度器,这个调度器是被动调度的。意思就是他不会主动调度。而且当一个协程发现自己执行不下去了(比如异步等待网络的数据回来,但是当前还没有数据到),这个时候就可以由这个协程通知调度器,这个时候执行到调度器的代码,调度器根据事先设计好的调度算法找到当前最需要 CPU 的协程。切换这个协程的 CPU 上下文把 CPU 的运行权交个这个协程,直到这个协程出现执行不下去需要等等的情况,或者它调用主动让出 CPU 的 API 之类,触发下一次调度。 

关系与知识点梳理

  1. 资源分配

    • 进程拥有独立的资源。
    • 线程共享进程资源,但拥有独立的栈和计数器。
    • 协程共享线程资源,通过协作来实现切换。
  2. 执行和调度

    • 进程由操作系统调度。
    • 线程由操作系统调度,但在同一进程内切换成本较低。
    • 协程由用户控制调度,适合IO密集型任务。
  3. 并发性

    • 进程和线程可以并发执行。
    • 协程通过协作实现并发,适合处理高并发IO操作。
  4. Python中的实现

    • Python中的线程由于GIL(全局解释器锁)的存在,CPU并行执行受限。
    • Python推荐使用协程,通过asyncawait关键字实现。
  5. 常见错误

    • 错误地认为进程和程序是同一个概念。
    • 错误地认为线程是完全独立的。
    • 错误地认为协程是操作系统级别的调度单元。
  6. 协程的实现

    • 协程通常在单个线程内实现,通过asyncio库等。
    • 协程的切换由协程自身控制,当遇到IO操作时挂起,让出CPU给其他协程。
  7. 1:N模式

    • 一个线程可以包含多个协程,协程之间通过非抢占式调度进行切换。
  • 33
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值