首页 > 其他分享 >协程介绍

协程介绍

时间:2024-03-09 15:46:52浏览次数:22  
标签:协程 Coroutine 介绍 并发 running 线程 切换

协程(Coroutine)是一种用户态的轻量级线程,它可以在单线程内实现多个执行线程的切换和调度,而无需依赖操作系统的线程管理机制(简单来说可以认为协程是线程里不同的函数,这些函数之间可以相互快速切换)。协程通常被称为“轻量级线程”或“用户级线程”。

协程的主要特点和优点包括:

  1. 轻量级: 协程的创建和切换成本很低,因为它们不需要像操作系统线程那样依赖内核态的线程切换。相比之下,创建和切换操作系统线程需要更多的系统资源。

  2. 协作式调度: 协程的调度是由程序员显式控制的,而不是由操作系统调度器来决定。这种协作式调度可以避免操作系统线程的上下文切换开销,并且可以更好地适应特定应用程序的需求。

  3. 简化并发编程: 协程可以简化并发编程,因为它们可以在同一线程内执行多个任务,并且可以通过显式的切换来控制任务的执行顺序和并发度。这使得编写高效的并发程序变得更加容易。

  4. 高并发性能: 由于协程是在单线程内执行的,因此可以避免多线程并发时的锁竞争和资源争夺问题,从而提高了并发程序的性能。

  5. 简化异步编程: 协程可以用于编写异步程序,例如异步IO操作或事件驱动的编程模型。协程可以在IO阻塞时切换到其他任务,从而提高了程序的并发性能。

总的来说,协程是一种轻量级的并发编程模型,具有低成本、高性能和简化编程等优点,适用于需要高并发性能和简洁代码的场景。
以下是一个使用C++中的协程库<coroutine>的简单例子:

#include <iostream>
#include <coroutine>

// 定义一个协程类型
struct MyCoroutine {
    // 协程状态枚举
    enum class State { Ready, Running, Done };

    // 定义协程状态
    State state = State::Ready;

    // 协程函数
    void operator()() {
        std::cout << "Coroutine started." << std::endl;
        state = State::Running;
        // 模拟一些计算
        for (int i = 0; i < 3; ++i) {
            std::cout << "Coroutine running " << i + 1 << std::endl;
            // 挂起协程
            co_yield;
        }
        std::cout << "Coroutine finished." << std::endl;
        state = State::Done;
    }
};

int main() {
    // 创建协程对象
    MyCoroutine coroutine;

    // 调用协程函数
    auto coroutine_handle = std::coroutine_handle<MyCoroutine>::from_fn(coroutine);
    coroutine_handle();

    // 模拟在其他任务中调度协程
    for (int i = 0; i < 3; ++i) {
        std::cout << "Main thread running " << i + 1 << std::endl;
        // 挂起主线程
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}

这个例子中,我们定义了一个简单的协程类型MyCoroutine,并在其中实现了一个简单的协程函数。在main函数中,我们创建了一个协程对象,并通过std::coroutine_handle来调用协程函数。在主线程中,我们模拟了其他任务的执行,然后再回到协程中执行。

这段代码将输出以下内容:

Coroutine started.
Coroutine running 1
Main thread running 1
Coroutine running 2
Main thread running 2
Coroutine running 3
Main thread running 3
Coroutine finished.

这里的输出顺序是先输出协程开始执行的消息,然后依次输出协程内部的计数消息和主线程中的计数消息,最后输出协程执行完成的消息。这个例子展示了协程和主线程之间的交替执行。

标签:协程,Coroutine,介绍,并发,running,线程,切换
From: https://www.cnblogs.com/fly-smart/p/18062782

相关文章

  • AVFormatContext介绍(avformat.h)
    typedefstructAVFormatContext结构体介绍表示解复用(解码)或复用(编码)多媒体流的格式上下文。在使用FFMPEG进行开发的时候,AVFormatContext是一个贯穿时钟的数据结构,很多函数都要用它作为参数。它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。typedefstructAVFormatContext......
  • java17新特性简单介绍
    前言本项目使用的IDE为IDEA2023.3.3(社区版)。文本块java17之前的写法,双引号需要转义,换行需要\n,需要加号拼接publicclassTestString{publicstaticvoidmain(String[]args){Stringjson="{\n"+"\"id\":\"1\",\n&qu......
  • netcat 命令介绍及使用示例
    netcat命令介绍及使用示例nc(netcat)是一个强大的网络工具,它可以用于读取和写入数据流,支持TCP和UDP协议。它常被用于网络调试和网络服务的创建。一、安装方法centos中,执行yuminstallncprocps-ng-y二、功能介绍1.IP端口监控使用nc进行端口扫描可以检查指定主机的......
  • python面试题 :进程、线程、协程的区别
    进程、线程和协程区别1.进程进程是系统资源分配的最小单位,系统由一个个进程(程序)组成一般情况下,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。文本区域存储处理器执行的代码数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动......
  • (笔记)Vivado操作之时序约束介绍
     一、前言      任何一个FPGA工程都需要设置相关的时序约束,下面将介绍Vivado中如何进行时序约束操作以及各种约束的使用方法。 二、时序约束界面        在一个工程运行到IMPLEMENTATION后,进入到左侧的FlowNavigator窗口,点击IMPLEMENTION下的EditConstraint......
  • 57WebAssembly逆向介绍
     当涉及到使用爬虫技术时,选择pywasm还是wasmer-python主要取决于你的具体需求、目标网站的复杂性和性能要求。以下是对这两个库在爬虫场景下的方便性对比:pywasm方便性:PythonicAPI:pywasm提供了符合Python风格的API,对于Python开发者来说可能更加直观和易于使用。集成性......
  • Hbase介绍
    什么是HbaseHbase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统,利用Hbase技术可在廉价的PCServer上搭建大规模结构化存储集群。利用HadoopHDFS作为其文件存储系统,利用HadoopMapReduce来处理Hbase中的海量数据,利用Zookeeper作为其分布式协同服务主要......
  • sqlite.dll介绍,sqlite.dll文件缺失的解决方法,3分钟快速修复sqlite.dll
    第一次见到这个dll,一般是找到这个dll,重新引用下。网上找到了关于这个dll的详细解释,其他dll应该也可以用这些方法修复,在此记录下。原文链接:https://zhuanlan.zhihu.com/p/668219472一.什么是SQLite.dllSQLite.dll是SQLite数据库引擎的一个关键组成部分。(SQLite是一个开源的嵌......
  • POSTGRESQL (PG) 6种索引类型介绍以及使用实例
    Postgresql中主要支持6种类型的索引:BTREE、HASH、GiST、SP-GiSP、GIN、BRIN。可以根据实际的应用场景选择合适的索引,BTREE、HASH是比较常用的索引。1.BTREE索引:CREATEINDEX默认使用BTREE索引,适合按照顺序存储的数据进行比较查询和范围查询,查询优化器会优先考虑使用BTREE索引,如......
  • Dash 2.16版本新特性介绍
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master大家好我是费老师,几天前Dash发布了其2.16.0版本,随后在修复了一些潜在问题后,于今天发布了可稳定使用的2.16.1版本,执行下面的命令进行最新版本Dash的安装:pipinstalldash-U2.16版本中为......