[英]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.