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

进程(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博客中,有一道题叫做移动零,题目要…

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…

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

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

汇编语言程序设计-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 汇编语言…

NAT地址转换+多出口智能选路,附加实验内容

本章主要讲&#xff1a;基于目标IP、双向地址的转换 注意&#xff1a;基于目标NAT进行转换 ---基于目标IP进行地址转换一般是应用在服务器端口映射&#xff1b; NAT的基础知识 1、服务器映射 服务器映射是基于目标端口进行转换&#xff0c;同时端口号也可以进行修改&…

方波的傅里叶变换及方波的MATLAB实现

一、傅里叶变换简介 傅里叶变换&#xff0c;表示能将满足一定条件的某个函数表示成三角函数&#xff08;正弦和/或余弦函数&#xff09;或者它们的积分的线性组合。傅里叶变换是一种线性的积分变换。它的理论依据是&#xff1a;任何连续周期信号都可以由一组适当的正弦曲线组合…

stm32h743 NetXduo 实现http server CubeIDE+CubeMX

在这边要设置mpu的大小,要用到http server,mpu得设置的大一些 我是这么设置的,做一个参考 同样,在FLASH.ld里面也要对应修改,SECTIONS里增加.tcp_sec和 .nx_data两个区,我们用ram_d2区域去做网络,这个就是对应每个数据在d2区域的起点。 在CubeMX里,需要用到filex、dhc…

无损音乐播放器推荐:Audirvana for Mac 中文激活版

udirvana 是一款高品质的音乐播放软件&#xff0c;专为Mac操作系统设计。它被设计来提供音频播放的最高标准&#xff0c;支持多种音频格式&#xff0c;包括高达32位/192kHz的高分辨率音频。Audirvana Plus 是其高级版本&#xff0c;提供了更多的功能和优化&#xff0c;例如音频…

Qt Mqtt客户端 + Emqx

环境 Qt 5.14.2 qtmqtt mqttx 功能 QT Mqtt客户端 qtmqtt 下载 qtmqtt (注意下载与QT版本相符的库)并使用QT 编译 编译完成后需要的文件: emqx 1.虚拟机中安装emqx,并启动 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash sudo apt-get inst…

前端Vue组件化实践:打造仿京东天猫商品属性选择器组件

在前端开发领域&#xff0c;随着业务需求的日益复杂和技术的不断进步&#xff0c;传统的整体式应用开发模式已逐渐显得捉襟见肘。面对日益庞大的系统&#xff0c;每次微小的功能修改或增加都可能导致整个逻辑结构的重构&#xff0c;形成牵一发而动全身的困境。为了解决这一问题…

树莓派PICO使用INA226测量电流和总线电压(3)

上一篇文章我们讲了如何测试电流&#xff0c;但是INA226有一个非常典型的问题&#xff0c;那就是误差比较大&#xff0c;因为采样电阻非常小&#xff0c;我的开发板用的是100mΩ的采样电阻&#xff0c;在设定中我也用的是这个采样电阻值&#xff0c;但事实上&#xff0c;测试得…