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

说说软件工程中的“协程”

在软件工程中,协程(coroutine)是一种程序运行的方式,可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释:

一、协程的基本概念

  1. 定义:协程是一组序列化的子过程,用户能像指挥家一样调度交叉执行。协程既可以用单线程实现,也可以用多线程实现,但无论如何,其核心特点是能够并行执行且可以交换执行权
  2. 执行方式:在协程中,多个线程(或函数)可以并行执行,但只有一个线程(或函数)处于正在运行的状态,其他线程(或函数)都处于暂停态(suspended)。线程(或函数)之间可以交换执行权,即一个线程(或函数)执行到一半时,可以暂停执行,将执行权交给另一个线程(或函数),等到稍后收回执行权时,再恢复执行。

二、协程的特性

  1. 可控制性:协程能做到可被控制的发起子任务,这是与线程相比的一个重要区别。
  2. 轻量级:协程非常小、占用资源比线程还少。在JVM平台上,协程的本质就是一次方法的调用。
  3. 状态保留:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态。
  4. 用户级线程:协程不像线程和进程那样,需要进行系统内核上的上下文切换。协程的上下文切换是由开发人员决定的,因此更加高效。

三、协程的应用场景

  1. 网络编程:使用协程可以使网络编程更加简洁和高效,例如实现高性能的服务器程序。
  2. 并发编程:协程可以简化并发编程,提高代码的可读性和可维护性,减少并发编程的复杂性。
  3. 异步编程:协程可以简化异步编程,避免回调地狱和多线程的问题,提高代码的可读性和可维护性。
  4. 资源管理:协程可以更好地管理资源,避免资源泄露和内存泄漏的问题。
  5. 任务调度:协程可以用于实现轻量级的任务调度器,实现任务的调度和执行。
  6. 状态机:协程可以用于实现复杂的状态机,简化状态机的实现和维护。
  7. 数据处理:协程可以用于处理大量的数据,提高数据处理的效率和性能。

四、协程与线程、进程的对比

  1. 线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程切换需要操作系统内核的支持,因此开销较大。
  2. 进程:进程是操作系统分配资源的最小单位,它包含一组执行中的程序的指令、还有程序所使用到的数据和引用到的系统资源(如文件、内存等)。进程切换同样需要操作系统内核的支持,开销同样较大。
  3. 协程:协程是一种用户级的轻量级线程,它的上下文切换是由开发人员决定的,不需要操作系统内核的支持,因此开销较小。这使得协程在并发编程和异步编程中具有更高的效率和更好的可维护性。

综上所述,协程是一种高效的程序运行方式,在软件工程领域具有广泛的应用前景。

五,当前能直接实现协程的开发语言

 直接支持协程的开发语言包括但不限于以下几种:

  1. Golang(Go)
    • Go语言从设计之初就内置了对协程的支持,通过轻量级的goroutine实现。
    • Goroutine是Go语言中的一种并发体,它比线程更轻量,由Go运行时管理。
    • Go语言的协程特性使其在系统编程、高性能计算和云计算领域具有显著优势。
  2. Kotlin
    • Kotlin是一种在JVM上运行的静态类型编程语言,它支持协程作为一等公民。
    • Kotlin协程提供了一种在保持代码简洁性的同时实现高效并发的方法。
    • Kotlin协程特别适用于Android开发,以及需要在JVM上运行的其他应用程序。
  3. C#
    • C#是Microsoft开发的一种多范式编程语言,自某个版本开始引入了异步编程模式,包括async和await关键字,这些关键字可以视为协程的一种实现方式。
    • C#的协程特性使其特别适用于需要处理大量IO操作或需要高效并发处理的应用程序。
      using System;
      using System.Threading.Tasks;class Program
      {static async Task AsyncTask(int step, int delay){await Task.Delay(delay); // 模拟异步操作Console.WriteLine($"Step: {step}");}static async Task CoroutineLikeExample(){for (int i = 0; i < 5; i++){await AsyncTask(i + 1, 1000); // 等待异步任务完成}Console.WriteLine("All steps completed.");}static void Main(string[] args){CoroutineLikeExample().Wait(); // 等待异步方法完成(在Main方法中需要这样做,因为Main不能是异步的)}
      }

  4. Python
    • Python通过其内置的asyncio库支持异步编程,这可以看作是一种协程的实现方式。
    • 虽然Python的asyncio库不是传统意义上的协程,但它提供了一种编写异步代码的方法,使代码更加简洁和易于维护。
    • Python的协程特性在数据科学、机器学习、Web开发和自动化脚本等领域具有广泛应用。
  5. JavaScript
    • JavaScript通过其内置的async/await语法和Promise对象支持异步编程,这也可以看作是一种协程的实现方式(尽管在严格意义上它可能不是传统意义上的协程)。
    • JavaScript的协程特性使其在Web开发、全栈开发和实时应用等领域具有广泛应用。
  6. C++(C++20及以后)
    • C++20标准引入了协程支持,通过co_await、co_yield和co_return等关键字实现。
    • C++的协程特性使其在系统编程、高性能计算和实时系统等领域具有显著优势。 
#include <iostream>
#include <coroutine>
#include <memory>
#include <thread>
#include <chrono>// 定义协程的返回类型和promise类型
struct MyTask {struct promise_type;using handle_type = std::coroutine_handle<promise_type>;struct promise_type {MyTask get_return_object() {return MyTask{handle_type::from_promise(*this)};}std::suspend_always initial_suspend() { return {}; }std::suspend_always final_suspend() noexcept { return {}; }void return_void() {}void unhandled_exception() { std::exit(1); }};handle_type coro;MyTask(handle_type h) : coro(h) {}~MyTask() { if (coro) coro.destroy(); }void resume() {if (coro.done()) return;coro.resume();// 注意:在实际应用中,你可能需要在这里添加循环或条件检查来避免忙等待}
};MyTask myCoroutine() {for (int i = 0; i < 6; ++i) {std::cout << "Step: " << i << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1)); // 休眠1秒co_await std::suspend_always{}; // 暂停协程}
}int main() {auto task = myCoroutine();// 模拟事件循环或任务调度器for (int i = 0; i < 6; ++i) {task.resume(); // 恢复协程的执行std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 简单的延迟,避免忙等待}return 0;
}

相关文章:

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…...

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时&#xff0c;有些时候&#xff0c;需要和第三方进行调式&#xff0c;但是第三方不在一起&#xff0c;需要进行远程调试&…...

javaScript交互案例2

1、京东侧边导航条 需求&#xff1a; 原先侧边栏是绝对定位当页面滚动到一定位置&#xff0c;侧边栏改为固定定位页面继续滚动&#xff0c;会让返回顶部显示出来 思路&#xff1a; 需要用到页面滚动事件scroll&#xff0c;因为是页面滚动&#xff0c;所以事件源是document滚动…...

JavaScript 浏览器对象模型 BOM

浏览器对象模型&#xff08;Browser Object Model&#xff0c;BOM&#xff09;是指一组与浏览器进行交互的 JavaScript 对象。它允许 JavaScript 与浏览器的组件进行交互&#xff0c;比如窗口、文档、历史记录等。BOM 不同于 DOM&#xff08;文档对象模型&#xff09;&#xff…...

基于MATLAB的激光雷达与相机联合标定原理及实现方法——以标定板为例

1.为什么要进行激光雷达和相机的联合标定&#xff1f; 激光雷达和相机的联合标定是为了将两种传感器的数据统一到同一坐标系中&#xff0c;从而实现更准确的环境感知。激光雷达提供精准的三维距离信息&#xff0c;而相机捕捉丰富的纹理和颜色&#xff0c;通过联合标定可以结合两…...

React(一)

文章目录 项目地址一、创建第一个react项目二、JSX语法2.1 生成列表2.2 大括号识别JS的表达式2.3 列表循环array2.4 条件判断以及假值显示2.5 复杂条件渲染2.6 事件处理2.7 添加CSS样式2.8 添加图片2.9 使用Fregments返回多个根标签2.10多条件渲染2.11 导出子组件2.12 给子组件…...

Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置

这里写自定义目录标题 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置一、Anaconda3配置1.Anaconda安装2.Anaconda更新3.Anaconda删除 二、pycharm配置1.pycharm安装 三、pytorch配置 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置 一…...

Postman之数据提取

Postman之数据提取 1. 提取请求头\request中的数据2. 提取响应消息\response中的数据3. 通过正在表达式提取4. 提取cookies数据 本文主要讲解利用pm对象对数据进行提取操作&#xff0c;虽然postman工具的页面上也提供了一部分的例子&#xff0c;但是实际使用时不是很全面&#…...

selenium元素定位校验以及遇到的元素操作问题记录

页面元素定位方法及校验 使用比较多的是通过id、class和xpath来对元素进行定位。在定位前可以现在浏览器验证是否可以找到指定的元素。这样就不用每添加一个元素定位都运行代码来检查定位方式表达式是否正确。 使用XPATH定位 在浏览器F12&#xff0c;找到元素&#xff0c;在元…...

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快

android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…...

用mv命令替换rm命令

# 用mv命令替换rm命令 主要内容来源自以上博文 rm命令穷凶极恶&#xff0c;以下为替换命令的方式&#xff0c;必做 步骤 修改vim ~/.bashrc加入以下代码 mkdir -p ~/.trash #在家目录下创建一个.trash文件夹(隐藏文件&#xff0c;ls -a 查看) alias rmdel #使用别名…...

电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现

电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现 电解车间铜业机器人剥片技术是现代铜冶炼过程中自动化和智能化的重要体现&#xff0c;它主要应用于铜电解精炼的最后阶段&#xff0c;即从阴极板上剥离出纯铜的过程。以下是该技术的几个关键点&#xff…...

【qt】控件2

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…...

Frida反调试对抗系列(四)百度加固

本文只是交流技术&#xff0c;如有侵权请联系我删除。 知识星球&#xff1a;https://t.zsxq.com/kNlj4 前言&#xff1a; 上一篇文章我们提到 我们使用github开源魔改好的frida server 但是仍然有一些厂商的server不能通过&#xff0c;那么这篇文章针对百度加固 进行快速通…...

Redis 安全

Redis 安全 Redis是一个开源的&#xff0c;高性能的键值存储系统&#xff0c;它通常被用作数据库&#xff0c;缓存和消息代理。由于其高性能和简单的API&#xff0c;Redis在全球范围内被广泛使用。然而&#xff0c;与其他数据库系统一样&#xff0c;Redis的安全性也是至关重要…...

上交大与上海人工智能研究所联合推出医学多语言模型,模型数据代码开源

今天为大家介绍的是来自上海交通大学的王延峰与谢伟迪团队的一篇论文。开源的多语言医学语言模型的发展可以惠及来自不同地区、语言多样化的广泛受众。 来源丨 DrugAI、 机器人的脑电波 论文&#xff1a;https://www.nature.com/articles/s41467-024-52417-z MMedC&#xff1…...

网络安全:我们的安全防线

在数字化时代&#xff0c;网络安全已成为国家安全、经济发展和社会稳定的重要组成部分。网络安全不仅仅是技术问题&#xff0c;更是一个涉及政治、经济、文化、社会等多个层面的综合性问题。从宏观到微观&#xff0c;网络安全的重要性不言而喻。 宏观层面&#xff1a;国家安全与…...

理解 Python 中的 __getitem__ 方法:在自定义类中启用索引和切片操作

理解 Python 中的 __getitem__ 方法&#xff1a;在自定义类中启用索引和切片操作 在Python中&#xff0c;__getitem__是一个特殊方法&#xff0c;属于数据模型方法之一&#xff0c;它使得Python对象能够支持下标访问和切片操作。这个方法提供了一种机制&#xff0c;允许类的实…...

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…...

vue2+3 —— Day5/6

自定义指令 自定义指令 需求&#xff1a;当页面加载时&#xff0c;让元素获取焦点&#xff08;一进页面&#xff0c;输入框就获取焦点&#xff09; 常规操作&#xff1a;操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs <input ref"inp" type&quo…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...