go并发-常见任务控制

Posted 文大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go并发-常见任务控制相关的知识,希望对你有一定的参考价值。

目录

1.只运行一次

2.等待任意任务完成

3.等待全部任务完成


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

go并发-常见任务控制

go并发-任务启动和取消

go并发-任务启动和取消

go并发-任务启动和取消

7.3 Go语言中通过WaitGroup控制并发

7.3 Go语言中通过WaitGroup控制并发