解决死锁

来源:16-3 并发调度器

拧壶冲

2020-09-28

本节讲到简单方式解决死锁,用channel发送 request到 workchan里面,也提到和waitgroup里面一样的方式。

func (scheduler *SimpleScheduler) Submit(r engine.Request) {
	go func() {
		scheduler.workerChan <- r
	}()
}

但是我记得waitgroup就是可以用来解决这个问题呢,为什么不用waitgroup来调度呢?每次发了request到workerchan里面,就done一次。总数10个waitgroup也可以

func (scheduler *SimpleScheduler) Submit(r engine.Request,wg *sync.WaitGroup) {
	w := worker {
		request: r
		done: func() {
			wg.done
		}
	}
	go func(worker) {
		scheduler.workerChan <- worker.request
		worker.done()
	}(w)
	
}
写回答

1回答

ccmouse

2020-09-28

这里我的表述有些歧义,意思是像waitgroup那个例子里用到的方式一样。waitgroup那个例子里,也使用了go开启一个goroutine,来避免这种收发都在一个goroutine导致死锁。具体在:https://git.imooc.com/coding-180/coding-180/src/master/lang/channel/done/done.go#L30 

而waitgroup本身并不能用来避免死锁,它只是用来等待任务完成。你后面的采用waitgroup的Submit里,还是使用了go func的形式来避免这种收发都是同一个goroutine导致的死锁问题。而waitgroup也是有用的,它可以让你知道什么时候发送完成。

不过这里在go func(worker)之前应该要加上:

wg.Add(1)


0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程