「让我们一起 Golang」怎样出让协程资源和设置可用 CPU 核心数
「让我们一起 Golang」怎样出让协程资源和设置可用 CPU 核心数
前面了解了协程的有关基础知识,了解了 CPS 并发模型,见识了 Golang 的百万级并发,下面我们来实现一下出让协程资源和设置可用 CPU 核心数。
出让协程资源
先看看执行结果:
我们可以看到先是子协程 0 打印内容,然后字协程 2 打印内容,然后出现了子协程 1 打印结果,之后又突然出现了子协程 0,然后是子协程 1 打印结果。
为什么是这样呢?先别急,先看一看代码想一想为什么!
这段代码是先激活 3 条子协程,分别是子协程 0、子协程 1、子协程 2。然后每条协程执行 task 函数,但是对子协程 1 执行runtime.Gosched()
操作。
下面来介绍一下runtime.Gosched()
,Gosched
生成一个处理器,允许其他goroutine
先运行。 它不会中止当前的 goroutine
,因此当前的 goroutine
会自动恢复运行。它的作用就是会把当前协程的优先级降低。
我们知道三条协程是并发的。但是这里对协程 1 实施了runtime.Gosched()
,这让子协程 1 出让了协程资源。所以最后打印输出的一定是子协程 1。但是,并不是所有的子协程 1 都是最后执行打印操作。这里有一个子协程 1 在子协程 0 之前打印输出了。我们把协程的数量加大。将主函数里面的 for 循环范围从 0~3 改为 0~108,我们会发现在最后打印的还是子协程 1.(由于输出结果过多,在此不展示输出结果)但是要注意的是,如果是百万级并发,同时开辟一百万条协程,最后的可能就不是子协程 1 了,因为runtime.Gosched()
虽然会降低协程的优先级,出让协程资源,但是并不一定让协程绝对的最后执行完毕。
设置可用 CPU 核心数
我们打开任务管理器,进入“性能”栏目,在 CPU 处右键选择“将图形更改为”,将“总体利用率”改为“逻辑处理器”。
这里可以看到图片里面的 CPU 核数为八。
然后我们可用利用 GO 语言查看电脑 CPU 的核数。
使用runtime.NumCPU()
打印即可。
而使用runtime.GOMAXPROCS(n)
可以设置运行的最大核数。这里是设置 CPU 的可用最大核心数为 1.而且该函数会有返回值返回先前的可用最大核心数。如果 n < 1,则不更改当前设置。
版权声明: 本文为 InfoQ 作者【Regan Yue】的原创文章。
原文链接:【http://xie.infoq.cn/article/618002c3dbd56a29428985847】。文章转载请联系作者。
评论