写点什么

「让我们一起 Golang」怎样出让协程资源和设置可用 CPU 核心数

用户头像
Regan Yue
关注
发布于: 4 小时前
「让我们一起Golang」怎样出让协程资源和设置可用CPU核心数

「让我们一起 Golang」怎样出让协程资源和设置可用 CPU 核心数

前面了解了协程的有关基础知识,了解了 CPS 并发模型,见识了 Golang 的百万级并发,下面我们来实现一下出让协程资源和设置可用 CPU 核心数。

出让协程资源

先看看执行结果:


子协程0 0子协程0 1子协程0 2子协程0 3子协程0 4子协程0 5子协程2 0子协程2 1子协程2 2子协程2 3子协程2 4子协程2 5子协程2 6子协程2 7子协程1 0子协程0 6子协程0 7子协程1 1子协程1 2子协程1 3子协程1 4子协程1 5子协程1 6子协程1 7
复制代码


我们可以看到先是子协程 0 打印内容,然后字协程 2 打印内容,然后出现了子协程 1 打印结果,之后又突然出现了子协程 0,然后是子协程 1 打印结果。


为什么是这样呢?先别急,先看一看代码想一想为什么!


func main() {  for i:=0;i<3;i++{    go func(index int) {      task("子协程"+strconv.Itoa(index))    }(i)  }  time.Sleep(5 * time.Second)}
func task(name string) { for i:=0;i<8;i++{ if name == "子协程1"{ //Gosched yields the processor, allowing other goroutines to run. It does not suspend the current goroutine, so execution resumes automatically. runtime.Gosched() } fmt.Println(name,i) }}
复制代码


这段代码是先激活 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 的核数。


package main
import ( "fmt" "runtime")
func main() {
fmt.Println("可用CPU核心数为",runtime.NumCPU()) // GOMAXPROCS sets the maximum number of CPUs that can be executing // simultaneously and returns the previous setting. If n < 1, it does not // change the current setting. // The number of logical CPUs on the local machine can be queried with NumCPU. // This call will go away when the scheduler improves. fmt.Println("设置CPU的可用核数为1,先前的设置为",runtime.GOMAXPROCS(1))}
复制代码


使用runtime.NumCPU()打印即可。


而使用runtime.GOMAXPROCS(n)可以设置运行的最大核数。这里是设置 CPU 的可用最大核心数为 1.而且该函数会有返回值返回先前的可用最大核心数。如果 n < 1,则不更改当前设置。

发布于: 4 小时前阅读数: 3
用户头像

Regan Yue

关注

还未添加个人签名 2020.08.12 加入

还未添加个人简介

评论

发布
暂无评论
「让我们一起Golang」怎样出让协程资源和设置可用CPU核心数