请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在循环里开goroutine两种不同写法,结果不同

老师,
engine/concurrent.go 文件的Run方法中,我写了一个和示例代码不同的开goroutine的方式,我的写法,会导致重复去Submit同一个url

    ##老师的写法,是在Submit方法里去开goroutine
    for _, r := range seeds {
		engine.Scheduler.Submit(r)
	}
	func (scheduler *SimpleScheduler) Submit(request engine.Request) {
		go func() {
			scheduler.c <- request
		}()
    }
	##我的写法,是在循环里直接开goroutine,
	for _, r := range seeds {
	    go func(){
	      engine.Scheduler.Submit(r)
	    }()
	}
	func (scheduler *SimpleScheduler) Submit(request engine.Request) {
			scheduler.c <- request
    }
	

正在回答

1回答

ccmouse 2019-10-04 15:04:32

这里是一个for+goroutine常见的错误。
for _, r := range seeds
这句话里,r的生命周期是整个for,它的值依次为seeds里面的一个元素。循环结束的时候它就是seeds里的最后一个元素。
由于循环内部开了goroutine访问r,由于闭包的关系r一直不会销毁是seeds的最后一个元素。而这些所有的goroutine都访问了这个r,所以都是最后一个元素。
这里可以通过把r当作这个无名函数的参数的方法来强行拷贝r。
我们也可以运行go vet来检查出这个错误。

0 回复 有任何疑惑可以回复我~
  • 提问者 方目目 #1
    谢谢老师,理解了。我也在网上搜了下,的确是个常见错误。https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables
    回复 有任何疑惑可以回复我~ 2019-10-14 23:21:18
  • 提问者 方目目 #2
    老师,我不太理解,ttps://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables 示例中的这种写法,也能正常运行
    for i := range valslice {
    	val := valslice[i]
    	go func() {
    		fmt.Println(val)
    	}()
    }
    回复 有任何疑惑可以回复我~ 2019-10-14 23:34:19
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号