一文了解Go 并发与并行

 更新时间:2024年05月15日 10:12:18   作者:比猪聪明  
并发性和并行性是是两个既有联系又有所区别的概念,本文主要介绍了Go并发与并行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Go语言,由Google的Robert Griesemer、Rob Pike和Ken Thompson于2009年开发,是一种静态类型、垃圾回收、多线程并发的编程语言。Go语言的设计目标是简单、高效、易于使用。它的并发模型非常强大,可以轻松地处理大量并发任务,这使得Go语言成为现代高性能并发应用的理想选择。

在Go语言(Golang)中,并发(Concurrency)和并行(Parallelism)是两个既有联系又有所区别的概念

并发(Concurrency)

并发指的是在一段时间内,多个任务能够开始、执行和完成,这些任务在宏观上看起来是同时进行的,尽管在微观层面上它们可能并不是真正的同时执行。Go语言通过goroutines(轻量级线程)和channels(用于goroutines间通信的安全通道)来支持高效率的并发编程。并发的重点在于任务的组织和管理,使得即使在单个CPU核心上,也能通过时间切片和任务调度,给予用户多个任务同时进行的错觉。

并行(Parallelism)

并行则是指在物理上或逻辑上的多个处理器(或多核CPU)同时执行多个任务。当程序能够充分利用多核处理器的多个核心,使得不同的任务或任务的部分确实同时在不同的处理器上执行,这就是并行。Go语言的运行时能够自动利用多核处理器,使得当有足够的goroutines需要运行时,它们可以被分配到不同的CPU核心上并行执行,从而提升程序的执行效率。

goroutine的实现原理

goroutine的实现原理主要依赖于Go语言的运行时(runtime)和调度器(scheduler)。当我们创建一个goroutine时,运行时会为其分配一个独立的栈空间,并将其加入到调度器的运行队列中。调度器会根据goroutine的优先级和状态(运行、休眠、阻塞等)来调度它们的执行。

channel的实现原理

channel的实现原理主要依赖于Go语言的运行时和内存模型。当我们创建一个channel时,运行时会为其分配一个缓冲区,用于存储数据。channel的读写操作是原子的,这意味着它们不会被中断。当一个goroutine向channel中写入数据时,运行时会将数据放入缓冲区,并通知其他goroutine。当一个goroutine从channel中读取数据时,运行时会从缓冲区中取出数据,并通知其他goroutine。

关系与区别

  • 区别:并发关注的是任务的执行方式和任务间的协作,能够在单核或多核环境下工作,不保证任务绝对同时执行。而并行关注的是任务的实际同时执行,需要多核环境来实现。
  • 联系:并发是并行的基础,没有并发就没有并行。并发使得程序能够在逻辑上分解为多个独立执行的单元,而并行则是在硬件层面实现这些单元的同时执行,从而达到更高的性能。 
for i := 1; i <= 10; i++ {

	go func() {
		fmt.Println("123")
	}()
}

 这段代码展示了Go语言中并发的特性。for循环与通过go关键字启动的goroutines之间是并发执行的。具体分析如下:

  • 并发性: 当for循环每次迭代时,它都会启动一个新的goroutine并通过go func() {...}()表达式。这意味着循环继续进行下一次迭代时,刚启动的goroutine几乎立刻开始执行,无需等待前一个goroutine完成。因此,这些goroutine的执行是并发的——它们的执行在时间上重叠,不过实际的执行顺序取决于Go运行时的调度策略和可用的处理器核心。

  • 并行性: 是否并行执行(即是否同时在多个处理器核心上执行)则取决于运行时环境和当前系统的负载。如果系统有多个处理器核心且goroutines的数量足够多以至于它们不能全部在一个核心上高效执行,Go的调度器可能会将这些goroutine分布在不同的核心上并行执行。然而,对于这段特定的代码,由于goroutine内的工作非常轻(仅打印一个空字符串),并行收益不大,甚至可能全部在一个核心上顺序快速执行完,因为启动goroutine和打印操作都非常快。

总结来说,这段代码展示了并发执行,而并行性取决于运行时的具体情况,但就这个简单的示例而言,并行效果可能不明显。

到此这篇关于一文了解Go 并发与并行的文章就介绍到这了,更多相关Go 并发与并行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go mongox简洁高效文档操作及bson数据构造流畅技巧

    go mongox简洁高效文档操作及bson数据构造流畅技巧

    这篇文章主要为大家介绍了go mongox简洁高效文档操作及bson数据构造流畅技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Golang控制通道实现协程等待详解

    Golang控制通道实现协程等待详解

    这篇文章主要介绍了Golang控制通道实现协程等待,通道是Go语言程序的并发体goroutine是它们之间的通信机制。一个通道是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个通道都有一个特殊的类型,也就是channels可发送数据的类型
    2022-11-11
  • go run main.go 一直提示找不到包的解决方案

    go run main.go 一直提示找不到包的解决方案

    这篇文章主要介绍了go run main.go 一直提示找不到包的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • go之如何设置GOROOT和GOPATH

    go之如何设置GOROOT和GOPATH

    这篇文章主要介绍了go之如何设置GOROOT和GOPATH问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Go语言实现猜数字小游戏

    Go语言实现猜数字小游戏

    这篇文章主要为大家详细介绍了Go语言实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • golang中validator包的使用教程

    golang中validator包的使用教程

    Validator 实际上是一个验证工具,属于 golang 的第三方包,这个包中使用了各种反射技巧来提供了各种校验和约束数据的方式方法,下面就跟随小编一起来学习一下validator包的使用吧
    2023-09-09
  • Golang中HttpRouter路由的使用详解

    Golang中HttpRouter路由的使用详解

    httprouter 是一个高性能、可扩展的HTTP路由,本文将通过一些简单的示例为大家讲讲httprouter 这个强大的 HTTP 路由是如何使用的,感兴趣的小伙伴可以了解一下
    2023-05-05
  • 简单聊聊Golang中Flag包的具体使用

    简单聊聊Golang中Flag包的具体使用

    flag 包是 Go 语言标准库中的一个包,用于解析命令行参数,这篇文章主要来和大家简单聊聊Golang中Flag包的具体使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • golang微服务框架kratos实现Socket.IO服务的方法

    golang微服务框架kratos实现Socket.IO服务的方法

    本文主要介绍了golang微服务框架kratos实现Socket.IO服务的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Golang中重复错误处理的优化方法

    Golang中重复错误处理的优化方法

    这篇文章主要给大家介绍了关于Golang中重复错误处理优化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论