当前位置: 首页 > news >正文

【并发编程】进程 线程 协程

进程(Process)、线程(Thread)和协程(Coroutine)构成了计算机科学中实现任务并发执行的三种核心抽象机制。通常,为了提高程序的执行效率,开发者会根据应用场景和性能需求,选择相应的并发策略:

  • 多进程(Multiprocessing):通过创建多个独立的进程,实现任务的并行处理。在这种策略中,每个进程拥有独立的内存空间,其适用于需要隔离性和独立资源分配的应用程序。

  • 多线程(Multithreading):在单个进程的上下文中,启动多个线程来同时处理多个任务。在这种策略中,线程间共享内存空间,其适合于提高应用程序的并发性和响应性。

  • 多协程(Coroutine multitasking):在单个线程的执行流中,通过协程来实现多个任务的协作式调度。

进程(Process)

进程是操作系统进行资源分配和调度的基本单位,每个进程都有独立的内存空间。由于进程的重量级特性,它们在内存中占据独立的位置,因此进程间上下文切换涉及的开销较大,包括栈、寄存器状态、虚拟内存以及文件句柄等的保存与加载,但是进程具有较好的隔离性和稳定性。

  • 优点:进程能够利用多核CPU进行真正的并行运算,增强计算能力
  • 缺点:相比线程与协程,进程占用较多系统资源,创建和销毁成本高,可同时运行的进程数量少
  • 适用场景:CPU-bound任务

线程(Thread)

线程,作为轻量级进程,是构成进程的基本执行单元,同时也是操作系统进行CPU调度的最小单位。每个线程都拥有独立的程序计数器、一组寄存器和自己的调用栈,确保了执行的独立性。与此同时,线程能够与同一进程中的其他线程共享进程资源,如内存空间、文件句柄和其他同步机制。

  • 优点:相比进程,创建和切换开销较小,占用资源相对较少
  • 缺点:
    • 相比进程:在Python等语言中,全局解释器锁(GIL)限制了多线程的多核并行能力
    • 相比协程:线程带来资源消耗和上下文切换成本,高并发时管理更复杂
  • 适用场景:并发数目少的I/O-bound任务

协程(Coroutine)

协程,也称为用户态线程,是一种在用户空间实现的轻量级执行单元。与线程相比,协程拥有更低的资源消耗和上下文切换开销。协程拥有自己的寄存器上下文和栈,其调度完全由用户控制,而非操作系统。在协程切换时,上下文和栈的保存与恢复操作在用户空间完成,避免了昂贵的内核态切换开销。

  • 优点:协程因其避免线程切换开销而提高了效率,简化了共享资源控制,且无需锁机制
  • 缺点:协程虽性能优越,但应用可能受限于库支持和实现复杂性
  • 适用场景:并发数目多的I/O-bound任务

联系 & 区别

  • 层级关系:1个进程中可以启动N个线程,1个线程中可以启动N个协程
  • 执行特性:线程可以并行执行,但线程内的协程是串行执行的,不能同时在多核上运行
  • 调度控制:操作系统自动调度进程和线程,用户显式控制协程调度,实现更灵活的管理
  • 同步&异步:线程和进程倾向于同步执行,而协程则更常用于异步操作
  • 抢占&非抢占:线程面临操作系统抢占,协程则由编程者控制,实现非抢占式执行
  • 资源承载:线程是CPU资源的分片,协程则在这些线程上实现细粒度的任务调度和执行

在这里插入图片描述

选择策略

在考虑优化策略时,首先根据任务特点进行选择,若任务为CPU-bound,则选择多进程;否则,根据任务量、协程支持情况以及实现复杂度选择,选择使用多线程或多协程。

在这里插入图片描述

http://www.lryc.cn/news/399039.html

相关文章:

  • Vue的生命周期函数有哪些?详细说明
  • 大语言模型应用--AI工程化落地
  • 我会什么开发技能
  • Run LoongArch64 Alpine VM on x86_64
  • 4层负载均衡和7层负载均衡
  • 前端Vue组件化实践:打造仿京东天猫商品属性选择器组件
  • 智慧城市3d数据可视化系统提升信息汇报的时效和精准度
  • Git 详解(原理、使用)
  • android11为开机动画添加铃声(语音)
  • 使用 Akshare 下载国内的期货(主力连续)、股票和指数的历史行情数据
  • 【React】Google 账号之个性化一键登录按钮功能
  • MySQL已经连接对应数据库,但mapper中表名仍报错
  • CentOS 7:停止更新后如何下载软件?
  • MySQL GROUP_CONCAT 函数详解与实战应用
  • MATLAB Gazebo联合仿真
  • Vue3 pdf.js将二进制文件流转成pdf预览
  • 【机器学习】逻辑回归的原理、应用与扩展
  • Ubuntu22.04系统装好后左上角下划线闪烁不开机(N卡)
  • Leetcode刷题4--- 寻找两个正序数组的中位数 Python
  • springBoot(若依)集成camunda
  • 【微信小程序知识点】自定义构建npm
  • JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断
  • 新手教学系列——高效管理MongoDB数据:批量插入与更新的实战技巧
  • C# Winform 自定义事件实战
  • Python通过继承实现多线程
  • 记一次项目经历
  • Elasticsearch 8 支持别名查询
  • 【Spring Cloud】 使用Eureka实现服务注册与服务发现
  • JDK安装详细教程(以JDK17为例)
  • 安装nodejs | npm报错