教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go的goroutine问题

go的goroutine问题

发布时间:2022-03-16   编辑:jiaochengji.com
教程集为您提供go的goroutine问题等资源,欢迎您收藏本站,我们将为您提供最新的go的goroutine问题资源

在写gobyexample的时候遇到一个问题如下

https://gobyexample.com/worker-pools

<pre name="code" class="plain">package main 2 import( 3 "fmt" 4 "time" 5 ) 6 type Message struct { 7 id int 8 data string 9 } 10 func main(){ 11 ch1:=make (chan Message ,19) 12 ch2:=make(chan Message ,19) 13 for i:=0;i<4;i { 14 go func (){ 15 f1(i,ch1,ch2) 16 }() 17 } 18 for i:=0;i<19;i { 19 var m Message 20 m.id=i 21 ch1<-m 22 } 23 for i:=0;i<19;i { 24 fmt.Println( <-ch2) 25 } 26 } 27 func f1(id int ,ch1 <-chan Message,ch2 chan <-Message){ 28 for msg :=range ch1{ 29 msg.data=fmt.Sprintf("%d",id) 30 time.Sleep(time.Second) 31 ch2<-msg 32 }</pre>
结果

<pre code_snippet_id="309908" snippet_file_name="blog_20140424_2_2509518" name="code" class="plain">{0 4} {1 4} {2 4} {3 4} {4 4} {5 4} {6 4} {7 4} {8 4} {9 4} {10 4} {11 4} {12 4} {13 4} {14 4} {15 4} {16 4} {17 4} {18 4}</pre>
按照道理说id应该是0,1,2,3怎么可能是4?

后来经过大牛指点做了一些改进

<pre code_snippet_id="309908" snippet_file_name="blog_20140424_3_4920279" name="code" class="plain"> 1 package main 2 import( 3 "fmt" 4 "time" 5 ) 6 type Message struct { 7 id int 8 data string 9 } 10 func main(){ 11 ch1:=make (chan Message ,19) 12 ch2:=make(chan Message ,19) 13 for i:=0;i<4;i { 14 go func (){ 15 f1(i,ch1,ch2) 16 }() 17 time.Sleep(time.Second) 18 } 19 for i:=0;i<19;i { 20 var m Message 21 m.id=i 22 ch1<-m 23 } 24 for i:=0;i<19;i { 25 fmt.Println( <-ch2) 26 } 27 } 28 func f1(id int ,ch1 <-chan Message,ch2 chan <-Message){ 29 for msg :=range ch1{ 30 msg.data=fmt.Sprintf("%d",id) 31 time.Sleep(time.Second) 32 ch2<-msg</pre>
在创建goroutine的时候多了一行time.Sleep(time.Second)

结果

<pre code_snippet_id="309908" snippet_file_name="blog_20140424_4_1965084" name="code" class="plain">{0 0} {1 1} {2 2} {3 3} {4 0} {5 1} {6 2} {7 3} {8 0} {9 1} {10 2} {11 3} {12 0} {13 1} {14 2} {15 3} {16 0} {17 1} {18 2}</pre>
相信大家都猜到为什么了吧:就是创建goroutine所花时间超过4次for循环当创建goroutine去取参数值的时候i已经为4了

但是真正出现这种情况的深层次原因,造成的是操作系统,还是语言本身,具体细节还望大牛指点


到此这篇关于“go的goroutine问题”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
简单理解 Goroutine 是如何工作的
Goroutine的调度分析(一)
[Go 教程系列笔记] goroutine(协程)
golang 深入浅出之 goroutine 理解
关于 goroutine 调度问题
22Go常见的并发模式和并发模型
Golang的map并发安全
GO 语言之 Goroutine 原理解析
golang 切片截取 内存泄露_怎么看待Goroutine 泄露
Go 语言到底适合干什么?

[关闭]
~ ~