go语言学习笔记—进阶—并发编程:调整并发的运行性能(gomaxprocs)(代码片段)

Locutus Locutus     2023-01-19     530

关键词:

go语言的运行时(runtime)实现了一个小型任务调度器,它类似于操作系统的线程调度,可以高效地把CPU资源分配给每一个任务。通过runtime.GOMAXPROCS()函数,可以指定线程池中线程与CPU核心数量的对应关系,如下:

这里,当主机逻辑CPU数量<1时,不修改任何值;主机逻辑CPU数量=1,单核心执行;主机逻辑CPU数量>1,多核并发执行。

runtime.GOMAXPROCS(主机逻辑CPU数量)

查询主机逻辑CPU数量,并设置并发执行核数。

fmt.Println(runtime.NumCPU())   // 查询主机逻辑CPU数量

runtime.GOMAXPROCS(runtime.NumCPU()) // 设置并发执行核数,也可以在程序启动前,设置环境变量GOMAXPROCS

go1.5之前默认单核执行;从go1.5开始,系统默认执行上述语句,以便并发执行代码,最大效率利用CPU。

go语言学习笔记—进阶—并发编程:同步sync,竞态检测——检测代码在并发环境下出现的问题(代码片段)

使用channel在多个goroutine之间交换数据,只是数据同步方法的一种。通道内部的实现依然使用各种锁。优雅代码的代行是性能。在某些轻量级场合,原子访问(atomic包)、互斥锁(sysnc.Mutex)以及等待组࿰... 查看详情

go语言学习笔记—进阶—并发编程:go语言的协程goroutine,与普通程序的协程coroutine

拿Python程序的coroutine与Go程序的goroutine做比较,两者都可以把函数或语句运行在独立的环境,但还是有不同点:goroutine可能并行执行,但coroutine始终顺序执行狭义地说,goroutine可能发生在多线程环境下。goroutine... 查看详情

go语言学习笔记—进阶—并发编程:为函数创建goroutine(代码片段)

使用go关键字为一个函数创建一个goroutine。函数与goroutine是一对多的关系,即可以为一个函数创建多个goroutine,一个goroutine必定只对应一个函数。为普通函数创建goroutine格式为一个go函数创建goroutine,写法如下:go... 查看详情

go语言学习笔记—进阶—并发编程:通道(channel)——在多个goroutine之间通信的管道(代码片段)

单纯地并发执行函数是无意义的,函数之间需要交换数据才能体现并发执行的意义。虽然可以使用“共享内存”的方式交换数据,但共享内存在不同goroutine间易发生竞态问题。为了保证数据交换的正确性,必须使用互... 查看详情

go语言学习笔记—进阶—并发编程(11):同步sync,等待组(sync.waitgroup)——保证在并发环境中完成指定数量的任务(代码片段)

除了使用通道channel和互斥锁sync.Mutex进行两个并发程序间的同步,我们还可以使用等待组(sync.WaitGroup)进行多个任务之间的同步。方法名功能(wg*WaitGroup)Add(deltaint)等待组的计数器+1(wg*WaitGroup)Done()等待组的计数器-1(... 查看详情

go语言学习笔记—进阶—并发编程:通道(channel)——各种各样的通道(代码片段)

单向通道在声明通道时,我们可以设置只发送或只接收。这种被约束操作方向的通道称为单向通道。声明单向通道只发送:chan<-,只接收:<-chanvar通道实例chan<-元素类型//只发送数据var通道实例<-chan元素... 查看详情

go语言学习笔记—进阶—并发编程:通道(channel)——使用channel收发数据(代码片段)

创建channel之后,我们可以使用channel进行数据收发操作。使用channel发送(填充)数据使用特殊的操作符<-,把数据通过channel发送。格式通道变量<-值通道变量是上文通过make创建的通道实例;值可以是变量... 查看详情

2.1go微服务实战(go语言进阶)---并发编程进阶

第8章 并发编程进阶8.1 竞态与并发模式 8.1.1 数据竞态 8.1.2 并发原理8.2 sync包 8.2.1 sync.Mutex互斥锁 8.2.2 sync.RWMutex多读写锁 8.2.3 sync.Once 8.2.4 sync.Cond 8.2.5 sync.Pool 8.2.6 sync.Map8.3 context包 8.3.1 应用场景 8.3.2 定义 8.3.3... 查看详情

go语言学习笔记—进阶—并发编程:互斥锁(sync.mutex)——保证同时只有一个goroutine可以访问共享资源(代码片段)

互斥锁(英语:Mutualexclusion,缩写Mutex)是一种在多线程编程中,防止两条线程同时对同一共享资源(比如全局变量)进行读写的机制。互斥锁通过把代码切片成一个个的临界区域(criticalsection࿰... 查看详情

对于go语言的进阶与依赖管理|青训营笔记(代码片段)

一.Go语言进阶与依赖管理1.1并发和并行Go可以充分发挥多核优势,高效运行。多线程程序在单核心的cpu上运行,称为并发;多线程程序在多核心的cpu上运行,称为并行。并发与并行并不相同,并发主要由切换时间片来实现“同时... 查看详情

go语言学习笔记—进阶—并发编程(10):读写互斥锁(sync.rwmutex)——在读比写多的环境下,比互斥锁更高效(代码片段)

在读多写少的场景中,可以优先使用读写互斥锁,sync包中的RWMutex提供了读写互斥锁的封装。var(countint//某个逻辑中使用的变量,如包级别变量、结构体成员字段变量countGuardsync.RWMutex//变量名+Guard,以表示这个... 查看详情

go并发编程

  优雅的并发编程范式,完善的并发支持,出色的并发性能是go语言区别于其他语言的一大特色.  1.并发基础  win和linux出现之前,程序员并没有并发的概念.因为命令式程序设计语言是以串行为基础的,程序会顺序执行每条指令... 查看详情

go笔记(十五):并发编程(代码片段)

一、协程的创建  Go语言支持并发,只需要通过go关键字来开启goroutine(协程)即可。  goroutine(协程)是轻量级线程,goroutine(协程)的调度是由Golang运行时进行管理的。goroutine语法格式(创建协程):go函数名(参数列表)示例代码如... 查看详情

09.go语言并发(代码片段)

Go语言并发并发指在同一时间内可以执行多个任务。并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等。本章讲解的并发含义属于多线程编程。Go语言通过编译器运行时(runtime),从语言上支持了并发的特性... 查看详情

并发编程(学习笔记-共享模型之内存)-part4(代码片段)

文章目录并发编程-4-共享模型之内存1.Java内存模型2.可见性2-1退不出的循环2-2可见性vs原子性3.有序性3-1诡异的结果3-2解决方法3-3有序性理解3-4happens-before4.volatile原理4-1如何保证可见性4-2如何保证有序性4-3double-checkedlocking问题并发... 查看详情

go语言系列之并发编程(代码片段)

Go语言中的并发编程并发与并行并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。Go语言的并发通过goroutine实现。goroutine类似于线程,... 查看详情

原创java并发编程系列04|java内存模型详解(代码片段)

【原创】Java并发编程系列04|Java内存模型详解收录于话题#进阶架构师|并发编程专题12个点击上方“java进阶架构师”,选择右上角“置顶公众号”20大进阶架构专题每日送达思维导图写在前面前面讲解了并发编程的三大核心问题:... 查看详情

2021-go语言并发编程

2021-GO语言并发编程1、Go语言并发概述2、GO语言多进程编程3、Go语言并发简略-多线程4、Go语言并发简略-非阻塞IO5、Go语言并发简略-协程6、并发简略-对比并发模型7、Go语言goroutine8、Go语言channel9、Go语言channel的操作10、Go语言channel... 查看详情