社区
其他技术讨论专区
帖子详情
for和协程问题
weixin_38048698
2019-09-20 10:35:58
这段代码不会输出爬到了1
这段代码会输出爬到了1,
各位老哥,帮忙分析一下这里面协程的调度情况
...全文
31
14
打赏
收藏
for和协程问题
这段代码不会输出爬到了1 这段代码会输出爬到了1, 各位老哥,帮忙分析一下这里面协程的调度情况
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 调度原理了。
coroutines-examples:Kotlin中的
协程
设计示例
Kotlin
协程
示例 该存储库包含Kotlin Coroutines Design的示例。 导航 (KEEP for Kotlin
协程
) (用户级文档)
详细解读tornado
协程
(coroutine)原理
tornado中的
协程
是如何工作的
协程
定义 Coroutines are computer program components that generalize subroutines for nonpreemptive multitasking, by allowing multiple entry points for suspending and resuming execution at certain locations.。 —— [ 维基百科 ] 我们在平常编程中,更习惯使用的是子例程(subroutine),通俗的叫法是函数,或者过程。子例程,往往只有一个入口(函数调用,实参
Python-
协程
office自动化
带你了解办公工具的自动化操作
golang for 循环创建
协程
问题
golang里,在for循环里面起
协程
,如下代码。会输出for循环的最后一个数,或者参杂有不确定的其他数字。 原因如下:golang是值拷贝传递。for循环很快,
协程
创建需要的时间大于for循环的时间。因为
协程
创建 需要进行 堆栈分配,上下文准备,以及与内核态的线程进行映射工作等。所以在
协程
创建好后,大家同时去访问tmp变量,这个时候 tmp 就被多个
协程
共享了,导致取到的值都一样了。 解决方案:就是使用golang的闭包函数。给匿名函数增加入参,因为是值传递,所以每次for创建一个协...
golang for循环里面创建
协程
问题
的研究
原本想在一个for里面创建10个
协程
,这些
协程
顺序拿到for的递增变量,把这10个递增变量都打印出来。但事与愿违,于是做实验,查书,思考,写出以下记录。 golang里,在for循环里面起
协程
,如下代码。会输出for循环的最后一个数,或者参杂有不确定的其他数字。 原因有二:1,golang是值拷贝传递;2,for循环很快就执行完了,但是创建的10个
协程
需要做初始化...
其他技术讨论专区
433
社区成员
791,270
社区内容
发帖
与我相关
我的任务
其他技术讨论专区
其他技术讨论专区
复制链接
扫一扫
分享
社区描述
其他技术讨论专区
其他
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章