GoLang并发示例代码1(关于逻辑处理器运行顺序)

文章目录

    • [一开始我也不知道为什么多次go run都是先运行第二个goroutine](#一开始我也不知道为什么多次go run都是先运行第二个goroutine)
go 复制代码
// This sample program demonstrates how to create goroutines and
// how the scheduler behaves.
package main

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

// main is the entry point for all Go programs.
func main() {
	// Allocate 1 logical processor for the scheduler to use.
	// 在多核机器上,如果不指定 GOMAXPROCS,默认会使用所有可用的处理器核。这里显式地将其设置为 1,使得所有的 goroutines 都在一个逻辑处理器上执行(即单线程调度)。
	// 限制调度器只使用一个 CPU 核心,即模拟单线程执行环境
	runtime.GOMAXPROCS(1)

	// wg is used to wait for the program to finish.
	// Add a count of two, one for each goroutine.
	// sync.WaitGroup 是用来等待一组 goroutine 完成的同步工具
	// WaitGroup 是一个计数器,在每个 goroutine 完成时调用 Done 方法,将计数器减少。调用 Wait() 会阻塞,直到计数器减到 0 为止。
	var wg sync.WaitGroup
	wg.Add(2)

	fmt.Println("Start Goroutines")

	// Declare an anonymous function and create a goroutine.
	go func() {
		// Schedule the call to Done to tell main we are done.
		defer wg.Done()

		// Display the alphabet three times
		for count := 0; count < 3; count++ {
			for char := 'a'; char < 'a' + 26; char++ {
				fmt.Printf("%c ", char)
			}
			fmt.Println()
		}
	}()

	// Declare an anonymous function and create a goroutine.
	go func() {
		// Schedule the call to Done to tell main we are done.
		defer wg.Done()

		// Display the alphabet three times
		for count := 0; count < 3; count++ {
			for char := 'A'; char < 'A'+26; char++ {
				fmt.Printf("%c ", char)
			}
			fmt.Println()
		}
	}()

	// Wait for the goroutines to finish.
	fmt.Println("Waiting To Finish")

	// wg.Wait() 会阻塞主线程,直到 WaitGroup 计数器归零(即所有 goroutines 都调用了 Done)
	wg.Wait()

	fmt.Println("\nTerminating Program")
}
bash 复制代码
root@GoLang:~/proj1/GoDistributeCache# go run /root/proj1/GoDistributeCache/example/test.go
Start Goroutines
Waiting To Finish
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
a b c d e f g h i j k l m n o p q r s t u v w x y z 

Terminating Program
root@GoLang:~/proj1/GoDistributeCache# 

一开始我也不知道为什么多次go run都是先运行第二个goroutine


当改成runtime.GOMAXPROCS(2)每次运行结果就不一定相同顺序了

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

相关推荐
程序员老陆4 分钟前
从语法糖到类型系统:深度拆解 C++ Lambda 与可调用对象的“血缘关系”
开发语言·c++·程序设计
(Charon)5 分钟前
【C++面试】设计模式:手写单例模式与工厂模式
开发语言·c++
估值探索者6 分钟前
【Python量化系统工程实战 #01】数据存储选型 CSVSQLiteMySQL 对比与 SQLite 实战建库
开发语言·jvm·python·sqlite·api接口·数据api接口·股票数据api接口
专业程序开发源11 分钟前
flask动漫推荐系统32319-计算机课程设计、毕业设计
java·spring boot·后端·django·flask·php·课程设计
根目录下的猫13 分钟前
ROS 2 C++(rclcpp)版本,实现话题订阅、话题发布,以及完整编译运行流程
开发语言·c++·算法
FYKJ_201018 分钟前
springboot手工蜀绣在线销售系统60947-计算机课程设计、毕业设计
java·spring boot·后端·python·mysql·spark·课程设计
vx_Biye_Design20 分钟前
springboot老年人用药智能管理系统38605-计算机课程设计、毕业设计
java·spring boot·后端·python·django·课程设计·express
сокол26 分钟前
【Python-基础-环境搭建】Ubuntu Python 开发环境搭建:编译、pipenv、pyenv、远程连接
开发语言·python·ubuntu
苏离~Hack31 分钟前
惠民云平台开发实战:基于 Vue3 + Django 的社区服务系统设计与实现
后端·python·django
liangshanbo12152 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript