golang coroutine 的等待与死锁

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

直接上代码:

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 的等待与死锁

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