[Golang]一个非典型的GoRoutine的错误

[Golang]一个非典型的GoRoutine的错误,第1张

概述 在不少golang入门的文章上,用并发的例子一般是这样写的; package mainimport ( "fmt" "time" ) func main() { messages := make(chan int) go func() { time.Sleep(time.Second * 3) messages <- 1 }() go func() { time.Slee 

在不少golang入门的文章上,用并发的例子一般是这样写的;

package mainimport (    "fmt"    "time" ) func main() { messages := make(chan int) go func() { time.Sleep(time.Second * 3) messages <- 1 }() go func() { time.Sleep(time.Second * 2) messages <- 2 }() go func() { time.Sleep(time.Second * 1) messages <- 3 }() go func() { for i := range messages { fmt.Println(i) } }() time.Sleep(time.Second * 5) }

我之前的项目,也一直是这样写。今天和群里的讨论了下,才发觉,这个写法其实是比较丑陋的。

其实可以通过这个去实现。

package mainimport (    "fmt"    "io/IoUtil"    "log"    "net/http"    "sync" ) func main() { urls := []string{ "http://www.reddit.com/r/aww.Json","http://www.reddit.com/r/funny.Json","http://www.reddit.com/r/programming.Json",} JsonResponses := make(chan string) var wg sync.WaitGroup wg.Add(len(urls)) for _,url := range urls { go func(url string) { defer wg.Done() res,err := http.Get(url) if err != nil { log.Fatal(err) } else { defer res.Body.Close() body,err := IoUtil.ReadAll(res.Body) if err != nil { log.Fatal(err) } else { JsonResponses <- string(body) } } }(url) } go func() { for response := range JsonResponses { fmt.Println(response) } }() wg.Wait() }

这个更简单,而且也更方便使用。性能方面,应该比chan要好点。

我之前的一个案例是,clIEnt发一个http request过来, 服务器收到请求,然后同时开N个go routine去处理,然后每个处理完成后,通过chan 进行传递给主线程,主线程判断chan的是否接收完成所有的请求,然后再响应。

就是用的第一种方法。

今天根据群里面体的建议,重构了下。使用List来处理每个用户请求。

比如,有个全局Map变量: map[int]List,每个请求创建一个巍峨唯一的随机数或者sessionID,然后每个go rouine处理完后,根据sessionID去查找对应的List,插入数据。

可以利用List来实现异步队列的机制,避免锁。

所以特地在这记录下来,当然各位新人的参考。

总结

以上是内存溢出为你收集整理的[Golang]一个非典型的GoRoutine的错误全部内容,希望文章能够帮你解决[Golang]一个非典型的GoRoutine的错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1288469.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存