首页 > 其他分享 >协程概览

协程概览

时间:2024-02-07 20:23:33浏览次数:22  
标签:协程 概览 栈协程 有栈 线程 对称 多线程

目录

什么是协程

我们可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的;

同时,协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系统中用户态线程的切换需要内核态线程的辅助;

比如下面是一个简单的例子:

void A() {
   cout << 1 << " ";
   cout << 2 << " ";
   cout << 3 << " ";
}

void B() {
   cout << "x" << " ";
   cout << "y" << " ";
   cout << "z" << " ";
}

int main(void) {
  A();
  B();
}

显然,单线程中函数输出1 2 3 x y z

如果用libco库(c++的协程库)把这个改造一下

void A() {
   cout << 1 << " ";
   cout << 2 << " ";
   co_yield_ct();  // 切出到主协程
   cout << 3 << " ";
}

void B() {
   cout << "x" << " ";
   co_yield_ct();  // 切出到主协程
   cout << "y" << " ";
   cout << "z" << " ";
}

int main(void) {
  ...  // 主协程
  co_resume(A);  // 启动协程 A
  co_resume(B);  // 启动协程 B
  co_resume(A);  // 从协程 A 切出处继续执行
  co_resume(B);  // 从协程 B 切出处继续执行
}

则会得到1 2 x 3 y z

切出跳出操作,协程中称之为yield 恢复和启动则称之为resume

那么为什么使用协程而不是多线程?

因为线程的操作太重量级了,而在当前的情况下,我们只是希望先暂停当前任务,等待io好了之后再切回来

协程的优缺点:

  • 减少了线程的重复高频创建;
  • 尽量避免线程的阻塞;
  • 让原来要使用异步+回调方式写的非人类代码,可以用看似同步的方式写出来,提升代码的可维护与可理解性(毕竟不需要考虑多线程那一套东西了)

缺点:

⽆法利⽤多核资源。线程才是系统调度的基本单位,单线程下的多协程本质上还是串⾏执⾏的,只能⽤到单核
计算资源,所以协程往往要与多线程、多进程⼀起使⽤。

协程的分类

对称协程与⾮对称协程

对称协程,协程可以不受限制地将控制权交给任何其他协程。任何⼀个协程都是相互独⽴且平等的,调度权可以在任意协程之间转移

⾮对称协程,是指协程之间存在类似堆栈的调⽤⽅-被调⽤⽅关系。协程出让调度权的⽬标只能是它的调⽤者。

有栈协程与⽆栈协程

有栈协程:⽤独⽴的执⾏栈来保存协程的上下⽂信息

⽆栈协程:它不需要独⽴的执⾏栈来保存协程的上下⽂信息,协程的上下⽂都放到公共内存中,当协程被挂起时,
⽆栈协程会将协程的状态保存在堆上的数据结构中,并将控制权交还给调度器。

标签:协程,概览,栈协程,有栈,线程,对称,多线程
From: https://www.cnblogs.com/liviayu/p/18011252

相关文章

  • 盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
    写在开头在Java的世界里万物皆对象。但我认为是万物皆数据,世界由各种各样数据构建起来,我们通过程序去实现数据的增删改查、转入转出、加减乘除等等,不同语言的实现方式殊途同归。由此可见,数据对于程序语言的重要性。这段话是在写数据类型那篇博客时说的,当时是为了引入Java中数据......
  • Shiro-00-shiro 概览
    RBACRBCARBCAzh_CNShiroApacheShiro是一个强大且易于使用的Java安全框架,负责执行身份验证、授权、加密和会话管理。通过Shiro的易于理解的API,您可以快速而轻松地保护任何应用程序,从最小的移动应用到最大的Web和企业应用。Shiro提供了应用程序安全API,用于执行......
  • 使用C语言构建一个独立栈协程和共享栈协程的任务调度系统
    使用了标准库头文件<setjmp.h>中的setjmp和longjmp两个函数,构建了一个简单的查询式协作多任务系统,支持独立栈和共享栈两种任务。其中涉及到获取和设置栈的地址操作,因此还需要根据不同平台提供获取和设置栈的地址操作(一般是汇编语言,因为涉及到寄存器)该调度系统仅运行在一个......
  • Shiro-00-shiro 概览
    RBACRBCARBCAzh_CNShiroApacheShiro是一个强大且易于使用的Java安全框架,负责执行身份验证、授权、加密和会话管理。通过Shiro的易于理解的API,您可以快速而轻松地保护任何应用程序,从最小的移动应用到最大的Web和企业应用。Shiro提供了应用程序安全API,用于执......
  • srs(state thread)如何实现协程切换
    417行的宏执行协程A上下文的保存419行_st_vp_schedule在RUNQ中找到一个待执行协程B,恢复协程B的上下文,切换到该协程B执行.协程B执行到io阻塞或者sleep事件,就会重新把协程B缓存起来,并寻找一个待执行协程(假设这里就AB两个协程),恢复协程A的上下文继续执行.完成协程切......
  • Python笔记四之协程
    本文首发于公众号:Hunter后端原文链接:Python笔记四之协程协程是一种运行在单线程下的并发编程模型,它的特点是能够在一个线程内实现多个任务的并发操作,通过在执行任务时主动让出执行权,让其他任务继续执行,从而实现并发。以下所有的代码都是在Python3.8版本中运行。本篇笔记......
  • 线程进程协程
    python(48):进程,线程,协程区别进程:拥有代码和打开的文件资源、数据资源、独立的内存空间。线程:线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程拥有自己的栈空间。对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。进程--......
  • python(48) 进程,线程 ,协程、
    python(48):进程,线程,协程、区别进程:拥有代码和打开的文件资源、数据资源、独立的内存空间。线程:线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程拥有自己的栈空间。对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。......
  • 协程操作
    基于async和await关键字的协程可以实现异步编程,这也是目前Python异步相关的主流技术。(一)asyncio模块asyncio模块是Python中实现异步的一个模块,该模块在Python3.4的时候发布asycnio和await关键字在Python3.5引入(二)事件循环事件循环就是可以把它当作一个while循环,这个while......
  • 协程理论
    (一)基于单线程来实现并发(0)并发的本质基于单线程实现并发即只用一个主线程(可利用的cpu只有一个)的情况下实现并发并发的本质:切换+保存状态cpu正在运行一个任务会在两种情况下去执行其他的任务一:发生了IO阻塞二:该任务的计算事件过长或者有一个优先级更高的任务代......