golang 学习笔记2

admin 2024-10-21 19:03:37 编程 来源:ZONE.CI 全球网 0 阅读模式
## Golang学习笔记2: 并发编程 并发编程是Go语言中的一大特点,它的并发模型是基于协程(goroutine)和通道(channel)的。本篇文章将介绍Golang中的并发编程,并探讨一些常用的并发处理模式。 ### 协程与通道 在Golang中,我们使用协程来实现轻量级的并发操作。协程是一种比线程更轻量级的并发单位,它由Golang运行时管理,并且可以根据需要自动扩展或收缩。协程的创建非常简单,只需在函数调用前添加`go`关键字即可。 ```go func doSomething() { // ... } func main() { go doSomething() // ... } ``` 上述代码中,`doSomething()`函数将在一个新的协程中运行,不会阻塞主程序的执行。协程之间可以通过通道进行通信,而通道则是Golang提供的一种数据结构,用于协程之间的安全数据传输。 ```go func produce(c chan<- int)="" {="" for="" i="" :="0;" i="">< 10;="" i++="" {="" c=""><- i="" }="" close(c)="" }="" func="" consume(c=""><-chan int)="" {="" for="" num="" :="range" c="" {="" fmt.println(num)="" }="" }="" func="" main()="" {="" c="" :="make(chan" int)="" go="" produce(c)="" consume(c)="" }="" ```="" 在上述代码中,我们创建了一个通道`c`,并将其作为参数传递给两个协程。`produce()`函数向通道发送数据,`consume()`函数从通道接收数据并打印。通过通道的阻塞操作,我们可以保证协程之间的同步与安全。="" ###="" 并发处理模式="" 在实际开发中,我们经常需要处理一些并发的任务。下面介绍几种常用的并发处理模式。="" ####="" 1.="" worker="" pool="" worker="" pool模式用于解决多个任务之间的负载均衡问题。该模式通过创建多个工作者(worker)协程并使用无缓冲通道来调度任务。="" ```go="" func="" worker(id="" int,="" jobs=""><-chan int,="" results=""><- int)="" {="" for="" j="" :="range" jobs="" {="" 执行任务="" results=""><- j="" *="" 2="" }="" }="" func="" main()="" {="" numjobs="" :="10" numworkers="" :="5" jobs="" :="make(chan" int,="" numjobs)="" results="" :="make(chan" int,="" numjobs)="" 创建工作者协程="" for="" i="" :="0;" i="">< numworkers;="" i++="" {="" go="" worker(i,="" jobs,="" results)="" }="" 添加任务到通道中="" for="" i="" :="0;" i="">< numjobs;="" i++="" {="" jobs=""><- i="" }="" close(jobs)="" 获取任务执行结果="" for="" i="" :="0;" i="">< numjobs;="" i++="" {=""><-results) }="" }="" ```="" 上述代码中,我们创建了一个`jobs`通道和一个`results`通道,分别用于发送任务和接收任务结果。然后我们创建多个工作者协程,并通过`jobs`通道接收任务。每个工作者协程会执行任务,并将结果发送到`results`通道中。最后,我们在主程序中从`results`通道中获取任务的执行结果。="" ####="" 2.="" 单例模式="" 并发环境中,我们通常需要确保某个对象的唯一性。golang中可以通过使用`sync.once`来实现单例模式。="" ```go="" type="" singleton="" struct="" {="" ...="" }="" var="" instance="" *singleton="" var="" once="" sync.once="" func="" getinstance()="" *singleton="" {="" once.do(func()="" {="" instance="&Singleton{}" })="" return="" instance="" }="" ```="" 在上述代码中,我们创建了一个`singleton`结构体,通过调用`getinstance()`函数获取该结构体的唯一实例。通过使用`sync.once`的`do()`方法,我们可以确保`instance`变量只会被初始化一次。这样,在多个协程同时调用`getinstance()`函数时,也能保证只创建一个实例。="" ###="" 总结="" 本篇文章介绍了golang中的并发编程,并探讨了协程和通道的使用方式。同时,我们还介绍了两种常见的并发处理模式:worker="" pool模式和单例模式。并发编程是golang的一大特点,合理地运用并发模型可以提高程序的性能和可伸缩性。希望本文能为读者在并发编程方面提供一些启示和帮助。="">
weinxin
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
golang 学习笔记2 编程

golang 学习笔记2

## Golang学习笔记2: 并发编程并发编程是Go语言中的一大特点,它的并发模型是基于协程(goroutine)和通道(channel)的。本篇文章将介绍G
golang 切片 并发安全 编程

golang 切片 并发安全

使用golang切片实现并发安全在开发过程中,处理并发访问的数据结构是非常重要的。在golang中,切片是一个常用的数据结构,但是它并不是线程安全的。本文将介绍
golang 时间转换 编程

golang 时间转换

在Go语言中,时间转换是一个常见而重要的操作。无论是将时间转换为字符串,还是将字符串转换为时间,对于任何一种应用程序来说,时间转换都是必不可少的。本文将介绍Go
golang http请求封 编程

golang http请求封

Go语言(Golang)是一种由Google开发的开源编程语言,它的出现给开发者带来了很多便利与效率。在网络编程领域,Golang的http包提供了简洁而强大的
评论:0   参与:  0