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并发-任务启动和取消

Go十大常见错误第8篇:并发编程中Context使用常见错误

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