go并发-常见任务控制
Posted 文大侠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go并发-常见任务控制相关的知识,希望对你有一定的参考价值。
目录
1.只运行一次
常用于并发场景下,单例实现,借助sync.Once实现,如下
type MyInstance struct {
}
var instance *MyInstance
var o sync.Once
func GetInstance() *MyInstance {
o.Do(func() {
fmt.Println("Create MyInstance")
instance = &MyInstance{}
})
return instance
}
func TestMyInstance(t *testing.T) {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
t.Logf("%d->%v\\n\\n", i, unsafe.Pointer(GetInstance()))
wg.Done()
}(i)
}
wg.Wait()
}
2.等待任一任务完成
比如输入搜索,后台起不同任务到不同网站爬取,先返回的任务即为结果。如下,注意其他的任务也返回,只是不关心结果,这里需要用带缓冲通道,否则其他任务无法返回。
func StartTask(count int) chan int {
ch := make(chan int, count) // 注意不能是阻塞通道
for i := 0; i < count; i++ {
go func(i int) {
fmt.Printf("%v->Start\\n", i)
time.Sleep(time.Duration(rand.Intn(100)))
fmt.Printf("%v->Stop\\n", i)
ch <- i
}(i)
}
return ch
}
func WaitAnyReturn(count int, msg chan int) {
<-msg
fmt.Println("Wait done-any return")
}
3.等待全部任务完成
golang中可使用WaitGroup来实现,如果要自己实现呢?
和上述实现类似,只是需要等待所有任务完成,如下
func WaitAllReturn(count int, msg chan int) {
for i := 0; i < count; i++ {
<-msg
}
fmt.Println("Wait done-all return")
}
func TestAnyTask(t *testing.T) {
rand.Seed(time.Now().UnixNano())
ret := StartTask(3)
WaitAnyReturn(3, ret)
ret = StartTask(3)
WaitAllReturn(3, ret)
}
原创,转载请注明来自
以上是关于go并发-常见任务控制的主要内容,如果未能解决你的问题,请参考以下文章