「让我们一起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,则不更改当前设置。

目录
相关文章
|
5月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
6月前
|
Java Go 调度
GO 协程
GO 协程
49 0
|
2月前
|
弹性计算 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:
319 1
|
3月前
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
3月前
|
存储 安全 算法
CPU资源
【10月更文挑战第2天】CPU资源
95 5
|
5月前
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
|
5月前
|
监控 Devops 测试技术
|
6月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
人工智能 Go
Go 等待协程完成
Go 等待协程完成
35 0
|
5月前
|
NoSQL MongoDB 索引
MongoDB 占用CPU资源过高
MongoDB 占用CPU资源过高
57 0

相关实验场景

更多