golang coroutine 的等待与死锁

u013834131 · · 6967 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

直接上代码:

1. 第一种情况, 如果没有select{}, main 主线程不会等待coroutine运行,导致coroutine得不到机会运行。

You are requesting eventual scheduling (using the two go statements) 
of two goroutines and then you exit main without giving the scheduler 
a chance to do anything. 

有了select, 程序正常运行。

package main import (	"fmt" "time" ) func main() {	go func1()	go func2()	select{} } func func1() { for{ fmt.Println("here1") time.Sleep(10 * time.Minute) } } func func2() { for{ fmt.Println("here2") time.Sleep(10 * time.Minute) }
}
 

2. coroutine有机会运行,但是会发生死锁, fatal error: all goroutines are asleep - deadlock!

The goroutine executing func1 exited, ditto for func2. The main goroutine is blocked with no hope to recover while no other goroutine can be scheduled.

package main import (	"fmt"	//"time" ) func main() {	go func1()	go func2()	select {	} } func func1() {	fmt.Println("here1") } func func2() {	fmt.Println("here2") } 


3. 第三种情况, 正常运行。

package main import (	"fmt" ) var c = make(chan int, 2) func main() {	go func1()	go func2()	<-c	<-c	fmt.Println("ok") } func func1() {	fmt.Println("here1")	c <- 1 } func func2() {	fmt.Println("here2")	c <- 1 } 

4. 实现上面的目的的另外一种方法:

 var wg sync.WaitGroup var urls = []string{ "http://www.golang.org/", "http://www.google.com/", "http://www.somestupidname.com/", } for _, url := range urls { // Increment the WaitGroup counter. wg.Add(1) // Launch a goroutine to fetch the URL. go func(url string) { // Decrement the counter when the goroutine completes. defer wg.Done() // Fetch the URL. http.Get(url) }(url) } // Wait for all HTTP fetches to complete. wg.Wait()



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u013834131

查看原文:golang coroutine 的等待与死锁

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6967 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传