Skip to content

Latest commit

 

History

History
73 lines (59 loc) · 1.73 KB

go 多线程工具 sync.WaitGroup.md

File metadata and controls

73 lines (59 loc) · 1.73 KB

引言 学习过Java的同学应该知道,CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待,在Java中经常使用, go语言中也有类似于 CountDownLatch的工具,sync.WaitGroup。

使用方法

var wg = &sync.WaitGroup{}  //定义
var processor = 2            //定义协程数
runtime.GOMAXPROCS(processor) //GOMAXPROCS sets the maximum number of CPUs that can be executing simultaneously
wg.Add(processor)           //协程数
go func() {                
	defer wg.Done()         //起一个协程,然后wg.Done,类似 countDownLatch.countDown()
    ...
	...
}()

go func() {                
	defer wg.Done()         //起一个协程,然后wg.Done,类似 countDownLatch.countDown()
    ...
	...
}()

wg.Wait()   //等待协程运行结束后再执行后面的程序
...

下面是一个具体的小例子: "github.com/robfig/cron"是一个定时任务的工具 package main

import ( "fmt" "github.com/robfig/cron" "runtime" "sync" "time" )

type testJob struct { }

func (t testJob) Run() { fmt.Println("hello world") }

func init() { c := cron.New() c.AddJob("0 */1 * * * ?", testJob{}) // 定时任务,每一分钟执行一次 c.Start() }

func main() { var wg = &sync.WaitGroup{} var processor = 2 runtime.GOMAXPROCS(processor) wg.Add(processor) //起一个协程,sleep 2分钟之后打印 go func() { defer wg.Done() time.Sleep(2 * time.Minute) fmt.Println("I am a goroutine") }() //另起一个协程,直接打印 go func() { defer wg.Done() fmt.Println("I am another goroutine") }()

wg.Wait()  //等2个协程结束之后,再运行主程序,打印end

fmt.Println("end")

}