当前位置: 首页 > wzjs >正文

广州建设厅电工网站江门建站网站模板

广州建设厅电工网站,江门建站网站模板,上海人才网官方网站,推广业务文章目录 一、并发编程1. goroutine:创建和调度 goroutine2. channel:无缓冲 channel、有缓冲 channel、select 语句2.1 无缓冲 channel2.2 有缓冲 channel2.3 select 语句 3. sync 包:Mutex、RWMutex、WaitGroup 等同步原语3.1 Mutex&#x…

文章目录

  • 一、并发编程
    • 1. goroutine:创建和调度 goroutine
    • 2. channel:无缓冲 channel、有缓冲 channel、select 语句
      • 2.1 无缓冲 channel
      • 2.2 有缓冲 channel
      • 2.3 select 语句
    • 3. sync 包:Mutex、RWMutex、WaitGroup 等同步原语
      • 3.1 Mutex:互斥锁
      • 3.2 RWMutex:读写互斥锁
      • 3.3 WaitGroup:等待多个 goroutine 完成

一、并发编程

Go 语言的并发编程是其一大亮点。通过 goroutinechannel,Go 使得并发编程变得简洁且高效。Go 还提供了 sync 包,包含了多种同步原语,帮助开发者在并发程序中处理共享数据和同步问题。

1. goroutine:创建和调度 goroutine

goroutine 是 Go 中最基本的并发单元,可以认为是轻量级的线程。通过 go 关键字可以轻松创建一个新的 goroutine,并发执行指定的函数或方法。

package mainimport ("fmt""time"
)// 一个简单的并发任务
func sayHello() {time.Sleep(1 * time.Second)fmt.Println("Hello from goroutine!")
}func main() {go sayHello() // 创建一个 goroutinefmt.Println("Hello from main!")time.Sleep(2 * time.Second) // 等待 goroutine 执行完毕
}

在这个示例中,go sayHello() 启动了一个新的 goroutine,并发执行 sayHello 函数。主函数继续执行并打印输出,最后通过 time.Sleep 等待 goroutine 完成。

在这里插入图片描述


2. channel:无缓冲 channel、有缓冲 channel、select 语句

channel 是 Go 语言用于不同 goroutine 之间通信的机制。通过 channel,可以安全地传递数据,避免了数据竞争问题。Go 提供了无缓冲和有缓冲的 channel,以及 select 语句来处理多个 channel 的操作。

2.1 无缓冲 channel

无缓冲 channel 会在发送数据和接收数据时进行同步,确保发送和接收操作相互配合。

package mainimport "fmt"func main() {ch := make(chan string) // 创建一个无缓冲 channel// 启动 goroutine 发送数据go func() {ch <- "Hello from goroutine!" // 向 channel 发送数据}()// 接收数据msg := <-chfmt.Println(msg) // 输出: Hello from goroutine!
}

2.2 有缓冲 channel

有缓冲的 channel 可以在发送数据时不必立即等待接收方,直到缓冲区满或接收方取走数据。创建有缓冲 channel 时,可以指定缓冲区的大小。

package mainimport "fmt"func main() {ch := make(chan string, 2) // 创建一个缓冲区大小为 2 的 channelch <- "Hello"ch <- "World" // 向 channel 发送两个消息fmt.Println(<-ch)fmt.Println(<-ch)
}

在这个示例中,channel 的缓冲区大小为 2,可以在不立即接收的情况下向 channel 发送两个数据。

2.3 select 语句

select 语句允许你等待多个 channel 操作。它类似于 switch 语句,但用于处理多个 channel 的发送或接收。

package mainimport ("fmt""time"
)func main() {ch1 := make(chan string)ch2 := make(chan string)go func() {time.Sleep(1 * time.Second)ch1 <- "Message from ch1"}()go func() {time.Sleep(2 * time.Second)ch2 <- "Message from ch2"}()// 使用 select 语句监听多个 channelselect {case msg1 := <-ch1:fmt.Println("Received:", msg1)case msg2 := <-ch2:fmt.Println("Received:", msg2)}
}

在这个示例中,select 会等待 ch1ch2 中的任一 channel 可用。当第一个 channel 可用时,它会立即执行对应的 case,并停止等待。

在这里插入图片描述


3. sync 包:Mutex、RWMutex、WaitGroup 等同步原语

Go 提供了 sync 包中的多种同步原语,用于处理并发程序中的共享资源访问问题。

3.1 Mutex:互斥锁

Mutex 是最常用的同步原语,它确保同一时刻只有一个 goroutine 可以访问共享资源。通过 LockUnlock 方法来加锁和解锁。

package mainimport ("fmt""sync"
)var counter int
var mutex sync.Mutexfunc increment() {mutex.Lock() // 加锁counter++mutex.Unlock() // 解锁
}func main() {var wg sync.WaitGroup// 启动多个 goroutine 进行并发操作for i := 0; i < 1000; i++ {wg.Add(1)go func() {defer wg.Done()increment()}()}wg.Wait() // 等待所有 goroutine 执行完毕fmt.Println("Final counter:", counter)
}

在这个示例中,使用 Mutex 来保证对 counter 的并发访问是安全的。

在这里插入图片描述

3.2 RWMutex:读写互斥锁

RWMutex 是一种读写互斥锁,它允许多个 goroutine 同时读取共享资源,但在写操作时会阻止其他的读写操作。

package mainimport ("fmt""sync"
)var counter int
var rwMutex sync.RWMutexfunc read() int {rwMutex.RLock() // 读锁defer rwMutex.RUnlock()return counter
}func write() {rwMutex.Lock() // 写锁counter++rwMutex.Unlock()
}func main() {var wg sync.WaitGroup// 启动多个 goroutine 进行读写操作for i := 0; i < 1000; i++ {wg.Add(1)go func() {defer wg.Done()write()}()}for i := 0; i < 1000; i++ {wg.Add(1)go func() {defer wg.Done()read()}()}wg.Wait()fmt.Println("Final counter:", counter)
}

在这个示例中,RWMutex 允许多个 goroutine 同时进行读操作,但在执行写操作时会锁住资源。

3.3 WaitGroup:等待多个 goroutine 完成

WaitGroup 用于等待一组 goroutine 执行完毕。它提供了 AddDoneWait 方法来控制并发流程。

package mainimport ("fmt""sync"
)func task(wg *sync.WaitGroup) {defer wg.Done() // 执行完毕时调用 Donefmt.Println("Task completed")
}func main() {var wg sync.WaitGroup// 启动多个 goroutinefor i := 0; i < 5; i++ {wg.Add(1) // 增加等待的 goroutine 数量go task(&wg)}wg.Wait() // 等待所有 goroutine 执行完毕fmt.Println("All tasks completed")
}

在这个示例中,WaitGroup 用于等待多个并发任务完成。


文章转载自:

http://KfQTF9ZC.Lqpzb.cn
http://DUXrYrcj.Lqpzb.cn
http://dKKTrlz4.Lqpzb.cn
http://wNbCiour.Lqpzb.cn
http://8kqd42CS.Lqpzb.cn
http://UqNkb00p.Lqpzb.cn
http://PJFAmaEg.Lqpzb.cn
http://W16Cde1q.Lqpzb.cn
http://PVx2stpZ.Lqpzb.cn
http://13KWLfmv.Lqpzb.cn
http://vPpKr0sI.Lqpzb.cn
http://1p0EAD3T.Lqpzb.cn
http://wgwJgd4B.Lqpzb.cn
http://ooGD67Fs.Lqpzb.cn
http://DqskZfvX.Lqpzb.cn
http://Jza0ObGz.Lqpzb.cn
http://YFjFYFsI.Lqpzb.cn
http://yStCNxOm.Lqpzb.cn
http://oWjYrceE.Lqpzb.cn
http://0sWARHTl.Lqpzb.cn
http://pkcqizXV.Lqpzb.cn
http://H0g9PDbh.Lqpzb.cn
http://0pzhfEtA.Lqpzb.cn
http://d3XE0cCl.Lqpzb.cn
http://hJFK36GC.Lqpzb.cn
http://NYQEmD4Y.Lqpzb.cn
http://lYFDRkOh.Lqpzb.cn
http://l6X3XTLd.Lqpzb.cn
http://w8ncuRYn.Lqpzb.cn
http://dF8evzTS.Lqpzb.cn
http://www.dtcms.com/wzjs/777302.html

相关文章:

  • 树苗网站源码什邡建设局网站
  • 美文的手机网站淘宝客网站一定要备案
  • 域名注册网站 简称十堰公司做网站
  • 博客做公司网站北京建站公司兴田德润信任
  • 网站开发学哪一个好公关公司多少钱一个月
  • 有视频接口怎么做网站课题组网站建设
  • 济宁网站建设只要500元wordpress瀑布墙
  • 东莞网站建设咨询外贸做企业什么网站
  • 小说网站建设需要什么js跳转到别的网站
  • 婚纱定制网站哪个好韶关网站开发
  • 昆明网站制作企业海淘手表网站
  • 深圳wap网站建设7天精通网站建设实录简介242
  • 中国建设银行个人网站银行广州专业网页制作
  • 建设银行 北京招聘网站开购物网站需要多少钱
  • 客户网站建设需要什么资料网站开发app开发培训
  • 房地产项目网站建设方案淄博公司制作网站有哪些
  • 男学网站开发胡芦娃app软件下载网站
  • 建设银行网银官方网站公司网站的具体步骤
  • 做视频网站 带宽计算网站建设优化需要懂那些知识
  • 一流的网站建设与优化京东云wordpress
  • 网站开发技术历史大连甘井子区地图
  • 网站怎么做缓存上海市城乡住房建设厅网站
  • 瑞华特散热器网站谁给做的推动高质量发展的必要性
  • 关于建设网站的合作合同重庆seo研究中心
  • 网站建设花钱少做网站的内容资源
  • 中山网站建设解决方案做动态效果的网站
  • 公司做网站需要哪些步骤网站怎样关键词排名优化
  • 自己做网站服务器做个营销网站
  • 帮人做兼职的网站吗wordpress管理员手册
  • 如何申请网站备案号手机网站注册