在golang中,只需要在函数调用前加上关键字go即可创建一个并发任务单元,而这个新建的任务会被放入队列中,等待调度器安排。相比系统的MB级别线程栈,goroutine的自定义栈只有2KB,这使得我们能够轻易创建上万个并发任务,如此对性能提升不少。但随之而来的有以下几个问题:

本文记录了笔者就以上几个问题进行探究的过程,文中给出了大部分问题的解决方案,同时也抛出了未解决的问题,期待与各位交流:p

准备

开始之前先定义一个常量const N=100以及一个HeavyWork函数,假定该函数具有极其冗长、复杂度高、难以解耦的特性

func HeavyWork(id int) {
	rand.Seed(int64(id))
	interval := time.Duration(rand.Intn(3)+1) * time.Second
	time.Sleep(interval)
	fmt.Printf("HeavyWork %-3d cost %v\n", id, interval)
}

以上定义的内容将在之后的代码中直接使用以缩减篇幅,大部分完整代码可在 Github: explore-goroutine 中找到

如何等待所有goroutine的退出

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-10
  • 2021-11-02
  • 2022-12-23
  • 2021-07-12
  • 2021-09-07
  • 1970-01-01
猜你喜欢
  • 2021-07-26
  • 2021-04-18
  • 2022-12-23
  • 2022-12-23
  • 2022-02-28
  • 2021-05-25
  • 2022-12-23
相关资源
相似解决方案