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

进程(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.mzph.cn/news/871597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux对文件访问的基本权限

文件权限控制对文件的访问。 有三种权限类别可应用:读取、写入和执行。 权限对文件和目录的影响: 权限 对文件的影响 对目录的影响 r读取 可以读取文件的内容 可以列出目录的内容 w写入 可以更改文件的内容 可以创建或删除目录中任一文件 x执行…

对照ui图进行大屏幕适配,echerts适配

1.先找到ui图,我这边是1920*1080的屏幕进行的设计 2.在界面找到跟样式的字体大小,进行设置,一般ui设置字体大小便可 3.在js中写入原生js代码 function adapter() {//获取布局视口宽度,布局视口设备横向独立像素值const dpWidth…

【算法专题】快速排序

1. 颜色分类 75. 颜色分类 - 力扣(LeetCode) 依据题意,我们需要把只包含0、1、2的数组划分为三个部分,事实上,在我们前面学习过的【算法专题】双指针算法-CSDN博客中,有一道题叫做移动零,题目要…

python的readline()和readlines()

readlines() readlines() 是 Python 中用于从文件对象中读取所有行的方法。它会一次性读取整个文件内容,并将每一行作为一个字符串存储在一个列表中返回。 使用方法和返回值 使用 readlines() 方法可以读取文件的所有内容,每一行作为列表中的一个元素…

《Reinforcement Learning: An Introduction》阅读学习笔记

1. 阅读书籍 请问,您读过《Reinforcement Learning: An Introduction》这本书吗?2. 常见英文缩写: MDP:Markov Decision Process,马尔可夫决策过程

JAVA NIO组件之Buffer详解

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Highlight.js示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"…

7.14实训

当我开始学习各种杀毒软件时&#xff0c;我逐渐意识到信息安全在现代社会中的重要性和复杂性。杀毒软件不仅仅是简单的安装和运行&#xff0c;它涉及到广泛的知识领域&#xff0c;包括计算机网络、恶意软件分析、加密技术等等。在这个过程中&#xff0c;我收获了许多宝贵的经验…

代码随想录算法训练营第30天|LeetCode 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

1. LeetCode 452. 用最少数量的箭引爆气球 题目链接&#xff1a;https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/ 文章链接&#xff1a;https://programmercarl.com/0452.用最少数量的箭引爆气球.html 视频链接&#xff1a;https://www…

Java 线程池详解

序言 在高并发编程中&#xff0c;线程池是一个非常重要的组件。它不仅能够有效地管理和复用线程资源&#xff0c;还可以提升应用程序的性能和稳定性。本文将详细介绍Java中的线程池机制&#xff0c;以及如何正确地使用线程池。 一、什么是线程池 线程池是一组已经初始化并等…

索引结构与检索原理

一、mysql索引结构 1.BTree索引 [检索原理] 左边列的表格&#xff08;真实数据&#xff09;&#xff0c;右边对应一棵树&#xff0c;树的管度越来越管查询越快。 以下图表的名称为&#xff1a;段区块 硬盘都是长方形的&#xff0c;打了一个封装&#xff0c;里面是一个圆圈…

二分查找和斐波那契查找

这里写自定义目录标题 二分查找斐波那契查找二分查找改进B二分查找改进C 二分查找 int binSearch(int* arr, int lo, int hi,int target) {while (lo < hi){int mid lo ((hi - lo) >> 1);if (arr[mid] > target) hi mid;else if (arr[mid] < target) lo mi…

springBoot 核心原理

自动配置 包扫描规则&#xff1a; 默认的扫描规则 SpringBootApplication 标注的类就是主程序类 &#xff0c;springBoot也只会扫描主程序类所在的包以及下面的子包也可以自定义声明扫描其他包 使用 SpringBootApplication(scanBasePackages “com.test”)使用 ComponentSca…

《妃梦千年》第三十一章:隐秘交易

第三十一章&#xff1a;隐秘交易 冤案得以昭雪&#xff0c;林清婉内心的重担终于稍稍放下&#xff0c;但她知道&#xff0c;朝中的局势依然复杂&#xff0c;风暴远未平息。她需要更加警惕&#xff0c;以防新的阴谋诡计。就在这个时候&#xff0c;一封密信再次送到她的手中&…

excel、word、ppt 下载安装步骤整理

请按照我的步骤开始操作&#xff0c;注意以下截图红框标记处&#xff08;往往都是需要点击的地方&#xff09; 第一步&#xff1a;下载 首先进入office下载网址&#xff1a; otp.landian.vip 然后点击下载 拉到下方 下载站点&#xff08;这里根据自己的需要选择下载&#x…

c#协变逆变

协变 协变允许你将一个泛型类型的子类型赋值给其父类型的变量。在C#中&#xff0c;协变主要通过以下方式实现&#xff1a; 委托的协变&#xff1a;从C# 4.0开始&#xff0c;委托可以是协变的&#xff0c;这意味着如果 D 继承自 B&#xff0c;则 Action<D> 可以隐式转换为…

汇编语言程序设计-7-高级汇编语言技术

7. 高级汇编语言技术 文章目录 7. 高级汇编语言技术7.0 导学7.1 子程序的另外一种写法-segment/ends-proc/endp7.2 程序的多文件组织7.3 汇编指令汇总7.4 汇编伪操作汇总7.5 汇编操作符汇总7.6 汇编过程7.7 宏汇编7.8 宏库7.9 条件汇编7.10 重复汇编7.11 80x86汇编7.12 汇编语言…

Facebook Research 的 Ocean 框架用于AR和CV的C++库

Ocean 是一个为各种任务设计的组件和库的集合,包括计算机视觉、几何、媒体处理、网络和渲染。以下是对Ocean框架的主要内容的简要概述: 主要目录结构 build/:不同构建系统的构建配置。doc/:包含各种文档。impl/:包含所有源代码。res/:包含所有资源文件,主要用于构建应用…

Typescript 的联合类型和交叉类型

在TypeScript中&#xff0c;联合类型&#xff08;Union Types&#xff09;和交叉类型&#xff08;Intersection Types&#xff09;是两种非常重要的类型系统特性&#xff0c;它们允许你以更灵活和强大的方式表示复杂的类型结构。 联合类型&#xff08;Union Types&#xff09;…

前端部署自动上传资源文件到cdn/oss 解决路由和访问慢的问题

参考文档&#xff1a;webpack-aliyun-oss-plugin - npm 安装依赖&#xff0c;这是一个预编译环境下的包 npm install webpack-aliyun-oss-plugin --save-dev 以下代码的意思是&#xff1a; webpack中引入一个oss上传插件&#xff0c;并且给予其初始参数&#xff0c;插件根据p…