for和协程问题

weixin_38048698 2019-09-20 10:35:58
这段代码不会输出爬到了1

这段代码会输出爬到了1,


各位老哥,帮忙分析一下这里面协程的调度情况
...全文
31 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38088844 2019-09-20
  • 打赏
  • 举报
回复
for死循环了啊………… 一般这里是监听一个退出的chan,任务完成后把这个chan close了,就退出了
weixin_38090265 2019-09-20
  • 打赏
  • 举报
回复
把for空循环改成 var quitchan =make(chan int) <- quitchan
weixin_38096599 2019-09-20
  • 打赏
  • 举报
回复
我也想了下,比较赞同你的说法,但我有个问题,一个协程的死循环会一直占用时间片而导致其他协程不能获得时间片吗?
weixin_38102396 2019-09-20
  • 打赏
  • 举报
回复
新版本的go,最大cpu数不是一个了,所以死循环并不会导致其他的协程不能执行。如果不写http.Get,只打印url不是也可以打印出来吗。所以应该是http包这个get有点问题。但是我也没弄懂希望大佬们能回答一下
weixin_38111004 2019-09-20
  • 打赏
  • 举报
回复
死循环了,其他协程得不到调度;
weixin_38113326 2019-09-20
  • 打赏
  • 举报
回复
主线程让出来,建议用sync.waitGroup加锁
weixin_38114857 2019-09-20
  • 打赏
  • 举报
回复
```golang package main import "fmt" func main() { for i:=0;i<10;i++{ go func(){ fmt.Printf("1") }() } for{} } ``` 结果:1111111111
weixin_38116100 2019-09-20
  • 打赏
  • 举报
回复
楼上说空for抢cpu的怕是go语言还没入门
weixin_38129642 2019-09-20
  • 打赏
  • 举报
回复
```golang func main() { for i:=0;i<10;i++{ go func(){ fmt.Println(i) go func() { time.Sleep(time.Second) fmt.Println(2) }() }() } for{} } ``` 10 7 10 10 10 10 10 10 3 10 2 2 2 2 2 2 2 2 2 2 好玩
weixin_38059788 2019-09-20
  • 打赏
  • 举报
回复
每次循环加上time.Sleep(time.Duration(2)*time.Second),让main等待协程启动,不然协程还没启动主函数就执行完了,就启动不了了
weixin_38067327 2019-09-20
  • 打赏
  • 举报
回复
程序最后加了 `for{}` 让`main`停留在了这里
weixin_38074335 2019-09-20
  • 打赏
  • 举报
回复
你遇到的这个问题应该不是for和协程的问题. ``` func main() { for i := 0; i < 1; i++ { go func(i int) { defer func() { fmt.Println("end-----") }() fmt.Printf("%d goroutine\n", i) res, err := http.Get("http://www.baidu.com") // 这里使用http正常,当使用https时和你的情况类似 if err != nil { panic(err) } fmt.Println(res) }(i) } for { } } ``` 不过还是很难解释你遇到的问题
weixin_38075729 2019-09-20
  • 打赏
  • 举报
回复
我猜是http.Get花费的cpu时间过长,被for{}抢断了时间片,线程数是11个,但是哪个都完成不了。第二个能输出因为主进程中也Get和Print了。这段时间足够其他线程跑完输出了,所以才能输出。第一段代码如果go的线程加上锁,也是可以输出的。这是我个人想法
weixin_38087753 2019-09-20
  • 打赏
  • 举报
回复
从结果看,第一段代码中其他协程饿死了,得不到调度。 简单点修改,不要让主协程一直占用CPU,可以在 for{}中加入 sleep。 ``` for { time.Sleep(time.Second) } ``` 更好的方式是使用 `sync.WaitGroup` 如果想要寻根问底,那就需要看看 go 调度原理了。

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧