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并发-常见任务控制的主要内容,如果未能解决你的问题,请参考以下文章