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

在软件工程中,协程(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474418.html

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

相关文章

使用 JavaScript 制作 To-Do List

使用 JavaScript 制作 To-Do List 本文记录了使用 HTML、CSS 和 JavaScript 制作一个简单的 To-Do List 网页的全过程&#xff0c;包含功能描述、代码实现以及优化方向。 **&#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的…

HarmonyOs鸿蒙开发实战(16)=>沉浸式效果第一种方案一窗口全屏布局方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 2.窗口全屏布局方案介绍 调整布局系统为全屏布局&#xff0c;界面元素延伸到状态栏和导航条区域实现沉…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中&#xff0c;使用MyBatis-Plus通过创建的实体类对数据库的操作过程中&#xff0c;通过实体创建数据库表是没有问题的&#xff0c;而在接口调用服务类操作数据库的时候&#xff0c;会出现报错。报错详情如下&#xff1a; 服务请求异…

高效工具推荐:基于WebGPU的Whisper Web结合内网穿透远程使用指南

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

力扣-Mysql-3322- 英超积分榜排名 III(中等)

一、题目来源 3322. 英超积分榜排名 III - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;SeasonStats --------------------------- | Column Name | Type | --------------------------- | season_id | int | | team_id …

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况 2024/11/16 13:42 缘起&#xff1a;最近需要通过iperf3打流&#xff0c;因此在ubuntu20.04服务器上常开sudo nethogs监控流量。 但是发现一个异常&#xff0c;ubuntu20.04服务器上发送的流量过大…

Stable Diffusion最全提示词写法教程

基础书写规则 所有单词都是通过英文书写&#xff0c;单词之间通过, 分割&#xff0c;注意是英文逗号&#xff1b;提示词之间是可以已通过换行书写的&#xff0c;并不会有什么影响&#xff1b;单个提示词的权重是1 , 默认情况下&#xff0c;越往前&#xff0c;权重越大&#xf…

TON商城与Telegram App:生态融合与去中心化未来的精彩碰撞

随着区块链技术的快速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为了数字生态的重要组成部分。而Telegram作为全球领先的即时通讯应用&#xff0c;不仅仅满足于传统的社交功能&#xff0c;更在区块链领域大胆探索&#xff0c;推出了基于其去中心化网络的…

Altenergy电力系统 status_zigbee SQL注入漏洞复现(CVE-2024-11305)

0x01 产品描述&#xff1a; Altenergy‌是一家专注于微型逆变器控制软件的公司&#xff0c;Altenergy电力系统控制软件是Altenergy电力系统公司的一款微型逆变器控制软件。 0x02 漏洞描述&#xff1a; Altenergy电力系统 status_zigbee接口处存在SQL注入漏洞&#xff0c;未经身…

3D Streaming 在线互动展示系统:NVIDIA RTX 4090 加速实时渲染行业数字化转型

随着科技的飞速发展&#xff0c;实时渲染正逐步成为游戏与实时交互领域的重要驱动力。与离线渲染不同&#xff0c;实时渲染需要极高的计算性能&#xff0c;对硬件设备尤其是GPU的性能要求极高。随着 RTX 4090 显卡的问世&#xff0c;其强大的算力和创新技术&#xff0c;为实时渲…

【vmware+ubuntu16.04】vm虚拟机及镜像安装-tools安装包弹不出来问题

学习机器人这门课需要下载虚拟机&#xff0c;做一下记录 首先我下载的是vm虚拟机16&#xff0c; 下载版本可参考该文章课堂上我下载 的镜像是16.04&#xff0c;虚拟机安装教程和镜像添加可参考该博主 按照教程安装成功 安装tools&#xff0c;但是我的弹不出来那个压缩包&…

Figma中文网:UI设计师的新资源宝库

Figma作为在线UI设计工具的先驱&#xff0c;已经在全球范围内被广泛使用&#xff0c;尤其是在中国&#xff0c;它已成为众多设计师的首选。本文将揭秘国内顶尖设计师们与Figma搭配使用的神秘伙伴——即时设计资源广场&#xff0c;这个被称为Figma中文网的平台&#xff0c;究竟有…

小试牛刀-Anchor安装和基础测试

目录 一、编写目的 二、安装步骤 2.1 安装Rust 设置rustup镜像 安装Rust 2.2 安装node.js 2.3 安装Solana-CLI 2.4 安装Anchor CLI 三、Program测试 四、可能出现的问题 Welcome to Code Blocks blog 本篇文章主要介绍了 [Anchor安装和基础测试] 博主广交技术好友&…

【后端】版本控制

版本控制 1. 什么是版本控制&#xff1f; 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理…

CC工具箱使用指南:【CAD导出界址点Excel】

一、简介 群友定制工具。 面图层导出界址点Excel表之前已经做过好几个&#xff0c;这个工具则是将CAD导出Excel。 CAD数据如下&#xff1a; 工具将如上截图中的边界线导出界址点Excel&#xff0c;并记录下面内的文字。 二、工具参数介绍 点击【定制工具】组里的【CAD导出界…

python画图|3D errorbars基础教程

【1】引言 前序学习了errorbar()函数的大部分功能&#xff0c;相关文章包括但不限于下述链接&#xff1a; python画图|errorbar初探_python ax.errorbar-CSDN博客 python画图|errorbar()进阶教程- uplims, lolims和xuplims, xlolims应用_ax.errorbar(x, y 0.5, xerrxerr, y…

RPA真的是人工智能吗?

1. RPA与AI的定义与区别 1.1 RPA的定义与特点 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种软件技术&#xff0c;它通过模拟人类用户的操作行为来自动执行重复性、基于规则的任务。RPA的核心特点包括&#xff1a; 非侵入性…

第23次CCF计算机软件能力认证

1. 数组推导 A 1 , A 2 , ⋯ , A n A_1, A_2, \cdots, A_n A1​,A2​,⋯,An​ 是一个由 n n n 个自然数&#xff08;即非负整数&#xff09;组成的数组。 在此基础上&#xff0c;我们用数组 B 1 ⋯ B n B_1 \cdots B_n B1​⋯Bn​ 表示 A A A 的前缀最大值。 B i max ⁡ {…