当前位置: 首页 > 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,则选择多进程;否则,根据任务量、协程支持情况以及实现复杂度选择,选择使用多线程或多协程。

在这里插入图片描述

相关文章:

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

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

Vue的生命周期函数有哪些?详细说明

Vue.js 的生命周期函数包括以下几个阶段,每个阶段都有相应的钩子函数可以用来在特定时机执行自定义的逻辑。这些生命周期钩子函数使得我们可以在组件的不同阶段进行操作,从而管理组件的状态和行为。 1. beforeCreate: - 描述:…...

大语言模型应用--AI工程化落地

文章目录 大语言模型概述什么是大语言模型什么是机器学习什么是深度学习 理解大语言模型历史沿革关键 AIGC系统AI工程化项目的落地落地的方法Prompt工程(第一阶段)RAG检索(第二阶段)训练特定功能模型(第三阶段&#xf…...

我会什么开发技能

java我会什么? 一、并发编程 1、并发编程:jdk中的courren包只能够类实现(seamplore,CountDownLaunch,Pharse,CycliBarrier,CompletableFuture),AQS的原理,线…...

Run LoongArch64 Alpine VM on x86_64

一、Build from source(build on x86_64) Obtain the latest libvirt, virt-manager, and qemu source code, compile and install them. 1.1 Build libvirt from source sudo apt-get update sudo apt-get install augeas-tools bash-completion debhelper-compat dh-apparm…...

4层负载均衡和7层负载均衡

四层负载均衡(Layer 4 Load Balancing)指的是在网络传输层(TCP/IP模型中的第四层)进行负载均衡的技术。四层负载均衡通常使用IP地址、端口号和协议等信息来将网络流量分配到多个服务器上。它主要关心网络层的信息,不涉…...

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

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

智慧城市3d数据可视化系统提升信息汇报的时效和精准度

在信息大爆炸的时代,数据的力量无可估量。而如何将这些数据以直观、高效的方式呈现出来,成为了一个亟待解决的问题。为此,我们推出了全新的3D可视化数据大屏系统,让数据“跃然屏上”,助力您洞察先机,决胜千…...

Git 详解(原理、使用)

git 快速上手请看这篇博客 Git 快速上手 1. 什么是 Git Git 是目前最主流的一个版本控制器,并且是分布式版本控制系统,可以控制电脑上所有格式的文档 版本控制器:记录每次修改以及版本迭代的管理系统 对于文本文件,可以记录每次…...

android11为开机动画添加铃声(语音)

一、碰到的问题 1、第一次开机无铃声 2、开机时铃声和动画不同步,开头的铃声会丢失 3、开机时铃声/动画不能完全播放完 二、解决 以下为添加的patch /开机铃声不同步,语音第一段无声 diff --git a/media/libmediaplayerservice/MediaPlayerService…...

使用 Akshare 下载国内的期货(主力连续)、股票和指数的历史行情数据

本文介绍如何使用 akshare 下载国内期货、股票和指数的历史行情数据。 Akshare 是一个丰富的金融数据查询的 Python 库,提供了大量的金融数据接口。本文将详细介绍如何使用 Akshare 下载期货、股票和指数数据,并提供完整的代码示例,以求大家…...

【React】Google 账号之个性化一键登录按钮功能

“使用 Google 帐号登录”功能可快速管理网站上的用户身份验证。用户登录 Google 账号、表示同意,并安全地与平台共享其个人基础资料信息。 官方文档:链接 一、获取 Google API 客户端 ID 打开 Google API 控制台 中的凭据页面 创建或选择 Google API 项…...

MySQL已经连接对应数据库,但mapper中表名仍报错

如图所示,已经连接对应数据库但还要在其中选择,表多了一个个选会很麻烦 此时找到下图界面 选中对应数据库应用,项目中所有mapper就能找到对应表啦...

CentOS 7:停止更新后如何下载软件?

引言 CentOS 7 是一个广受欢迎的 Linux 发行版,它为企业和开发者提供了一个稳定、安全、且免费的操作系统环境。然而,随着时间的推移,CentOS 7 的官方支持已经进入了维护阶段,这意味着它将不再收到常规的更新和新功能,…...

MySQL GROUP_CONCAT 函数详解与实战应用

提示:在需要将多个值组合成一个列表时,GROUP_CONCAT() 函数为 MySQL 提供了一种强大的方式来处理数据 文章目录 前言什么是 GROUP_CONCAT()基本语法 示例使用 GROUP_CONCAT()去除重复值排序结果 前言 提示:这里可以添加本文要记录的大概内容…...

MATLAB Gazebo联合仿真

准备仿真环境:在Gazebo中设置仿真场景,包括机器人模型、环境布局、传感器和执行器等。编写MATLAB脚本:在MATLAB中编写控制算法和数据处理脚本,用于接收Gazebo中的传感器数据,并生成控制命令。建立通信:通过…...

Vue3 pdf.js将二进制文件流转成pdf预览

好久没写东西,19年之前写过一篇Vue2将pdf二进制文件流转换成pdf文件,如果Vue2换成Vue3了,顺带来一篇文章,pdf.js这个东西用来解决内网pdf预览,是个不错的选择。 首先去pdfjs官网,下载需要的文件 然后将下载…...

【机器学习】逻辑回归的原理、应用与扩展

文章目录 一、逻辑回归概述二、Sigmoid函数与损失函数2.1 Sigmoid函数2.2 损失函数 三、多分类逻辑回归与优化方法3.1 多分类逻辑回归3.2 优化方法 四、特征离散化 一、逻辑回归概述 逻辑回归是一种常用于分类问题的算法。大家熟悉的线性回归一般形式为 Y a X b \mathbf{Y}…...

Ubuntu22.04系统装好后左上角下划线闪烁不开机(N卡)

折腾了半天以为是ubuntu的系统和硬件不匹配, 最后发现的确有点关系, 就是显卡驱动的问题 解决办法: 1. 进入到safty模式下, 然后配好网络环境 2. 移除所有的驱动相关的包, sudo apt-get remove --purge nvidia* 3.…...

Leetcode刷题4--- 寻找两个正序数组的中位数 Python

目录 题目及分析方法一:直接合并后排序方法二:二分查找法 题目及分析 (力扣序号4:[寻找两个正序数组的中位数](https://leetcode.cn/problems/median-of-two-sorted-arrays/description/) 给定两个大小分别为 m 和 n …...

springBoot(若依)集成camunda

1、下图为项目结构 2、最外层 pom引入依赖 <properties><!--camunda 标明版本&#xff0c;注意要个自己的Spring 版本匹配&#xff0c;匹配关系自行查询官网--><camunda.version>7.18.0</camunda.version> </properties> 3、common模块引入依赖 …...

【微信小程序知识点】自定义构建npm

在实际开发中&#xff0c;随着项目的功能越来越多&#xff0c;项目越来越复杂&#xff0c;文件目录也变得很繁琐&#xff0c;为了方便进行项目的开发&#xff0c;开发人员通常会对目录结构进行优化调整&#xff0c;例如&#xff1a;将小程序源码放到miniprogram目录下。 &…...

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…...

新手教学系列——高效管理MongoDB数据:批量插入与更新的实战技巧

前言 在日常开发中,MongoDB作为一种灵活高效的NoSQL数据库,深受开发者喜爱。然而,如何高效地进行数据的批量插入和更新,却常常让人头疼。今天,我们将一起探讨如何使用MongoDB的bulk_write方法,简化我们的数据管理流程,让代码更加简洁高效。 常规做法:find、insertone…...

C# Winform 自定义事件实战

在C#的WinForms中&#xff0c;自定义事件是一种强大的工具&#xff0c;它允许你创建自己的事件&#xff0c;从而在特定条件下通知订阅者。自定义事件通常用于封装业务逻辑&#xff0c;使代码更加模块化和易于维护。下面我将通过一个实战例子来展示如何在WinForms中创建和使用自…...

Python通过继承实现多线程

本套课在线学习视频&#xff08;网盘地址&#xff0c;保存到网盘即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/677661ea63b3​​ 本节将介绍如何利用Python中的thread模块和threading模块实现多线程&#xff0c;并通过继承threading.Thread类并重写run方…...

记一次项目经历

一、项目需求 1、设备四个工位&#xff0c;每个工位需要测试产品的电参数&#xff1b; 2、每个另外加四个位置温度&#xff1b; 3、显示4个通道电流曲线&#xff0c;16个通道温度曲线&#xff1b; 4、可切换工艺参数&#xff1b; 5、常规判定&#xff0c;测试数据保存到表格内&…...

Elasticsearch 8 支持别名查询

在 Elasticsearch 8 中&#xff0c;使用 Java 高级 REST 客户端进行别名管理的过程与之前的版本类似&#xff0c;但有一些API细节上的变化。以下是如何使用 Java 和 Elasticsearch 8 进行别名操作的例子&#xff1a; 引入依赖 确保你的项目中包含了 Elasticsearch 的高级 RES…...

【Spring Cloud】 使用Eureka实现服务注册与服务发现

文章目录 &#x1f343;前言&#x1f38d;解决方案&#x1f6a9;关于注册中⼼&#x1f6a9;CAP理论&#x1f6a9;常见的注册中心 &#x1f384;Eureka&#x1f6a9;搭建 Eureka Server&#x1f388;创建Eureka-server ⼦模块&#x1f388;引入依赖&#x1f388;项目构建插件&am…...

JDK安装详细教程(以JDK17为例)

一、JDK的下载 1. 前往oracle官网下载JDK Java Archive Downloads - Java SE 17 在这里选择对应的JDK版本&#xff0c;我这里就直接选择JDK17的版本了。 然后下载对应的软件包&#xff0c;我这里采用的是Windows的安装程序。 点击上述圈起来的链接即可下载安装包&#xff0c;…...

网站服务器迁移步骤/小说推广平台有哪些

代理模式的定义是&#xff1a;为一个对象提供代理&#xff0c;来控制对这个对象的访问。 在某些情况下&#xff0c;直接访问对象不方便或者对访问对象增强一些功能&#xff0c;可以使用到代理模式。比如想请一个明星来办一场商业演出&#xff0c;一般都是联系明星的经纪人&…...

珠海专业医疗网站建设/百度推广账号登录

题目 力扣 思路 用二进制的方法计算&#xff0c;先得到进位的值&#xff0c;用无符号整型表示。该位的值可以用异或表示&#xff0c;进位值用两数相与再往前移一位得到。 代码 class Solution { public:int getSum(int a, int b) {while(b){unsigned int carry(unsigned i…...

网站建设与准备/做网站推广

前言 这篇文章主要是从pinpoint-web界面入手&#xff0c;我们的目标是弄清楚两个问题&#xff1a; - 1、 pinpoint左侧服务地图上的调用量数据是怎么查询的&#xff1f;- 2、界面查询条件WasOnly是什么意思&#xff1f; 左侧服务地图调用量来源 从下图可以看出&#xff0c;A…...

莆田哪里有做网站的/如何进行搜索引擎优化

不敢发首页&#xff0c;放在家里纯属观摩 上回&#xff1a;博客园的故事&#xff0d;愤怒时的呐喊 上回说到&#xff0c;摩登女郎并不安分&#xff0c;偶尔制造“门事件”扩大影响&#xff0c;一时和尚门看到也颇感新鲜&#xff0c;竞相传阅&#xff0c;一时不亦乐乎&#xf…...

香港外贸网站建设/个人推广app的妙招

find命令简介&#xff1a; 实时、精确、支持众多查找标准遍历指定目录中的所有文件完成查找&#xff0c;速度慢&#xff1b;1&#xff0e;命令格式&#xff1a;locate filename 直接跟需要查找的文件 eg locate passwd 系统文件数据库中所有包含passwd的文件。find 查找路径…...

网站建设合同付款方式/郑州seo排名哪有

PaaS选择多多 首先&#xff0c;我想我们恐怕需要给平台即服务&#xff08;PaaS&#xff09;下个定义。PaaS环境是云计算服务平台&#xff0c;让开发人员可以构建并管理其Web应用程序&#xff0c;没必要面临基础设施的搭建和维护带来的复杂性。 或者换而言之&#xff1a;PaaS平台…...