以下go代码中是否有死锁?虽然不输出

时间:2014-07-21 19:10:57

标签: concurrency go

我正在运行以下go code并且它不会产生输出:

package main

import "fmt"
//import "strconv"
import "time"

func Wait(){
    time.Sleep(2000 * time.Millisecond)
}

func Print(c chan string){
    fmt.Println("Running Print go-routine")
    for{
        fmt.Println("len(c): ", len(c))
        str := <- c
        fmt.Println(str)
    }
}

func main() {
    c := make(chan string, 4)
    c <- "0"
    c <- "1"
    c <- "2"
    c <- "3"
    Wait()
    fmt.Println("Before go Print(c)")
    go Print(c)
    fmt.Println("After go Print(c)")
}

有僵局吗? Print(c)函数甚至没有调用......?这对我来说很奇怪。 go playground中的链接是:http://play.golang.org/p/tDjEJKwkRJ

2 个答案:

答案 0 :(得分:2)

没有错误,在goroutine中调用Print()函数,但主程序在此之后立即退出...所以goroutine终止。

阅读此演讲:Go Concurrency Patterns(或更好,view it's video),了解频道和goroutine的工作原理。

请记住,当main函数返回时程序已完成。

答案 1 :(得分:2)

main函数调用返回时,程序退出。它不会等待其他(非main)goroutines完成。

稍后在Wait声明后调用go Print(c)函数。例如,

package main

import (
    "fmt"
    "time"
)

func Wait() {
    time.Sleep(2000 * time.Millisecond)
}

func Print(c chan string) {
    fmt.Println("Running Print go-routine")
    for {
        fmt.Println("len(c): ", len(c))
        str := <-c
        fmt.Println(str)
    }
}

func main() {
    c := make(chan string, 4)
    c <- "0"
    c <- "1"
    c <- "2"
    c <- "3"
    fmt.Println("Before go Print(c)")
    go Print(c)
    Wait()
    fmt.Println("After go Print(c)")
}

输出:

Before go Print(c)
Running Print go-routine
len(c):  4
0
len(c):  3
1
len(c):  2
2
len(c):  1
3
len(c):  0
After go Print(c)
  

The Go Programming Language Specification

     

Program execution

     

通过链接单个未经插入的包来创建完整的程序   用它导入的所有包调用主包,   及物动词。主包必须具有包名main和声明   一个函数main,它不带参数,也不返回任何值。

func main() { … }
     

程序执行从初始化主程序包开始,然后   调用函数main。当该函数调用返回时,   程序退出。它不等待其他(非主要)goroutines   完整。