GO语言并发编程 | 青训营笔记

42 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第4天

前言

学习Go语言也快有一个月了,也算对go语言有一点初步了解了。在go语言的学习中也可以横向对比,更加能够体会到go语言的特点。Go语言在并发编程上十分有优势,本文对Go语言的并发编程进行了简要介绍。

并发编程

goroutine

  • 并发编程是Go的一大优势之一。当我们需要开启一个多线程时,Java语言由于new Thread()会消耗更多的资源,通常会使用线程池来完成相关多线程的需求。而如何合适的配置线程池也是一个需要慎重考虑的事情。
  • Go语言里面的goroutine实现在内核态,一个线程可以跑多个协程,其栈为KB级别。而线程的栈则有MB级别。这意味着goroutine的资源消耗相比线程小了许多。我们可以很轻松的进行一个多线程任务。
  • 通常来讲,Go语言时是不必要维护线程池的。但是如果追求极致的性能或者频繁的对协程进行创建和销毁,也是可以考虑使用线程池的。
  • 开启一个协程只需要一个go关键字,十分简单。
func helloGoroutine() {
  for i := 0; i < 5; i++ {
     go func(j int) {
        hello(j)
     }(i)
  }
  time.Sleep(time.Second)
}

channel

Go语言提倡通信共享内存,而不是共享内存而实现通信。其相对应的channel创建时可分为有缓冲的和无缓冲的。我认为这种方式可以进一步减少资源的消耗,实现更高的性能。

result := make(chan string)//无缓冲channel
result := make(chan string,3)//有缓冲channel

并发安全

sync.Mutex是Go语言的通用的锁,在会产生并发操作的代码前后添加Lock()和Unlock()可以实现并发安全。

wiatGroup为计数器功能。其add(delta int),Done(),Wait()分别为计数器加delta,计数器减1,主协程阻塞直到计数器为0的功能。用于协程间的同步阻塞。

思考与总结

用Go语言来实现多线程,其性能比较高并且编写起来也比较容易。我已经深深的爱上了Go语言的这种多线程编码方式。希望在继续学习Go语言的过程中,能体会到更多的乐趣。