簡體   English   中英

GOLANG:致命錯誤:所有goroutine都在睡眠中-死鎖

[英]GOLANG: fatal error: all goroutines are asleep - deadlock

package main
import (
    "fmt"
    "os"
    "os/exec"
    "bufio"
    "reflect"
)

func runTheCommand(ch chan<- string, cmD string)  {
    ouT,_ := exec.Command("sh","-c",cmD).Output()
    ch <- string(ouT)
}
// Readln returns a single line (without the ending \n) from the input buffered reader. An error is returned iff there is an error with the buffered reader.
func Readln(r *bufio.Reader) (string, error) {
    var (isPrefix bool = true
        err error = nil 
        line, ln []byte
    )   
    for isPrefix && err == nil {
        line, isPrefix, err = r.ReadLine()
        ln = append(ln, line...)
    }   
    return string(ln),err
}



func main() {
    var chans = []chan string{}
    f, _ := os.Open("../tmpStatus.config")
    r := bufio.NewReader(f)
    cmD, e := Readln(r)
    for e == nil {
        ch := make(chan string)
        chans = append(chans, ch) 
        go runTheCommand(ch,cmD)
        cmD,e = Readln(r)
    }   

    cases := make([]reflect.SelectCase, len(chans))
    for i, ch := range chans {
        cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}
    }   

    remaining := len(cases)
    for remaining > 0 { 
        chosen, value, ok := reflect.Select(cases)
        if !ok {
            cases[chosen].Chan = reflect.ValueOf(nil)
            remaining -= 1
            continue
        }
        fmt.Printf("%s", value.String())
    }   
}    

該代碼正確打印了通道中所有接收到的值。 但最后它退出並顯示以下錯誤:

致命錯誤:所有goroutine都在睡着-死鎖!

goroutine 1 [select]:reflect.rselect(0xc200283480、0x22、0x22、0xffffffffffffffff,0x0,...)/usr/local/go/src/pkg/runtime/chan.c:1212 + 0x10d Reflection.Select(0xc200066800, 0x22、0x22、0x1、0x0,...)/usr/local/go/src/pkg/reflect/value.go:1957 + 0x1fb

我是GO的新手。 我提到了google,並設法以某種方式編寫了有效的代碼。 我不完全了解此腳本的工作方式,尤其是反射包命令。 我的目的是並行執行../tmpStatus.config文件中列出的Unix命令並打印出結果。 我對GO提供的並發功能感到興奮,因此決定嘗試一下。 現在,它是如此快速地打印結果。 到現在為止,我是在python中一個接一個地執行此操作。 我在安裝到自定義位置的go版本go1.1.2 linux / amd64中運行了此腳本。 知道為什么會發生僵局嗎?

看來您正在嘗試讀取文件,然后將工作分散到多個工作程序中(散開)。 在您的代碼中看不到任何通道關閉。 請參閱https://gist.github.com/kylewolfe/7c54018a9ed16517c0dd以獲取我所引用的模式的示例。 對於文件的每一行,您將讀入一個通道,其中x個工作人員將從該通道中讀取(並反映/執行工作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM