温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Golang与.NET中怎么实现协程

发布时间:2021-07-06 15:08:45 来源:亿速云 阅读:403 作者:Leah 栏目:大数据

这篇文章将为大家详细讲解有关Golang与.NET中怎么实现协程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Golang goroutine

实现下面的代码可以显式指定编译器将goroutine调度到多个CPU上运行。

import "runtime"...runtime.GOMAXPROCS(4)

PS:runtime包中有几个处理goroutine的函数,

函数

说明

Goexit

退出当前执行的goroutine,但是defer函数还会继续调用

Gosched

让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行

NumCPU

返回 CPU 核数量

NumGoroutine

返回正在执行和排队的任务总数

GOMAXPROCS

用来设置可以并行计算的CPU核数的最大值,并返回之前的值

Go调度的几个概念:

M:内核线程;
G:go routine,并发的最小逻辑单元,由程序员创建;
P:处理器,执行G的上下文环境,每个P会维护一个本地的go routine队列;

Golang与.NET中怎么实现协程

除了每个P拥有一个本地的go routine队列外,还存在一个全局的go routine队列。

具体调度原理:

  1. P的数量在初始化由GOMAXPROCS决定;

  2. 我们要做的就是添加G;

  3. G的数量超出了M的处理能力,且还有空余P的话,runtime就会自动创建新的M;

  4. M拿到P后才能干活,取G的顺序:本地队列>全局队列>其他P的队列,如果所有队列都没有可用的G,M会归还P并进入休眠;

说到.NET的Task模型与Golang的协程大同小异:

M = Thread    

G = Task 

P = Processor 

关于Golang与.NET中怎么实现协程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI