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

简介: 「让我们一起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处右键选择“将图形更改为”,将“总体利用率”改为“逻辑处理器”。

image-20210801161637449

这里可以看到图片里面的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,则不更改当前设置。

目录
相关文章
|
7月前
|
移动开发 Linux
Linux下如何查看哪些进程占用的CPU内存资源最多
Linux下如何查看哪些进程占用的CPU内存资源最多
|
1月前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
226 1
|
2月前
|
存储 安全 算法
CPU资源
【10月更文挑战第2天】CPU资源
85 5
|
4月前
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
|
5月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
NoSQL MongoDB 索引
MongoDB 占用CPU资源过高
MongoDB 占用CPU资源过高
53 0
|
5月前
|
Java Go 调度
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
|
5月前
|
机器学习/深度学习 分布式计算 大数据
MaxCompute产品使用合集之如何查看空间资源、CPU和内存以及存储空间容量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
108 0
|
7月前
|
运维 Linux Docker
Docker详解(十一)——Docker容器CPU资源限额实战Docker详解
Docker详解(十一)——Docker容器CPU资源限额实战
155 5
|
7月前
|
存储 运维 Linux
Docker详解(十)——Docker容器CPU资源限额配置
Docker详解(十)——Docker容器CPU资源限额配置
314 3