Golang 实现守护主进程

复制代码
     package main

        import (
            "fmt"
            "runtime"
            "sync"
            "time"
        )

        func test_goroutine()  {
            fmt.Println("函数被执行了*************************")
        }

        func main()  {

            // 测试多核并行化
            // 在执一些昂贵的计算任务时,如果希望使用服务器的多核特性来尽量将任务实现并行化,从而达到降低总计算时间的目的
            // 当前Golang版本并不能智能地发现和利用多核优势,如果不进行特殊声明,实际上所有的goroutine都运行在一个CPU核心上,
            // 当一个goroutine得到时间片执行的时候,其他goroutine都会处于等待状态.
            // 在Golang升级到默认支持多个CPU之前,我们可以先通过设置环境变量GOMAXPROCS的值, 或者在代码中启动goroutine之前
            // 先调用相应的方法设置使用多少个CPU核心

            // 获取cpu核心数
            num_cpu := runtime.NumCPU()
            // 设置使用的cpu的核心数
            runtime.GOMAXPROCS(num_cpu)

            // 使用sync包实现
            var wg sync.WaitGroup

            // 获取执行任务前的时间戳
            start_time := time.Now().Unix()

            for i:=0; i<=3200000; i++{

                wg.Add(1) //添加WaitGroup计数器

                go func() {

                    defer wg.Done() //defer标记当前函数作用域执行结束后 释放一个计数器,必须有这一步操作

                    fmt.Println("函数被执行了*************************")
                }()
            }

            wg.Wait() //阻塞,直到WaitGroup中的计数器为0

            // 获取执行完成任务后的时间戳
            end_time := time.Now().Unix()
            fmt.Println(end_time-start_time)

            // 测试发现当进行简单的计算时,使用多核心和使用单核心执行时间上并没有出现差距, 资源的分配会出现时间损耗
            // 简单的计算不建议使用多核cpu进行高并发, 当进行昂贵复杂的计算最好经过充分的测试, 使用合适的核心数进行并发执行任务
        }
复制代码

 

posted @   lowmanisbusy  阅读(844)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示