Golang goroutine不与内部频道一起运行

Golang goroutine不与内部频道一起运行,第1张

概述我正在尝试实施一个字数统计程序,但第一步我遇到了一些问题. 这是我的代码: package mainimport ( "fmt" "os" "bufio" "sync")// Load data into channelfunc laodData(arr []string,channel chan string,wg sync.WaitGroup) { 我正在尝试实施一个字数统计程序,但第一步我遇到了一些问题.

这是我的代码:

package mainimport (    "fmt"    "os"    "bufio"    "sync")// Load data into channelfunc laodData(arr []string,channel chan string,wg sync.WaitGroup) {    for _,path := range arr {        file,err := os.Open(path)        fmt.Println("begin to laodData ",path)        if err != nil {            fmt.Println(err)            os.Exit(-1)        }        defer file.Close()        reader := bufio.NewReaderSize(file,32*10*1024)        i := 0        for {            line,err := reader.ReadString('\n')            channel <- line            if err != nil {                break            }            i++            if i%200 == 0 {                fmt.Println(i," lines parsed")            }        }        fmt.Println("finish laodData ",path)    }    wg.Done()}// dispatch data lines into different mappersfunc dispatcher(channel chan string,wg sync.WaitGroup){    fmt.Println("pull data 11")    line,ok := <- channel    fmt.Println(ok)    for ok {        fmt.Println(line)        line,ok = <- channel    }    fmt.Println("pull data 22")    wg.Done()}func main() {    path := os.Args    if len(path) < 2 {        fmt.Println("Need input files")        os.Exit(0)    }    var wg sync.WaitGroup    wg.Add(2)    channel := make(chan string)    defer close(channel)    fmt.Println("before dispatcher")    go laodData(path[1:],channel,wg)    go dispatcher(channel,wg)    wg.Wait()    fmt.Println("after dispatcher")}

这是我的输出:

...finish laodData  result.txtthrow: all goroutines are asleep - deadlock!goroutine 1 [semacquire]:sync.runtime_Semacquire(0x42154100,0x42154100)    /usr/local/go/src/pkg/runtime/zsema_amd64.c:146 +0x25sync.(*WaitGroup).Wait(0x4213b440,0x0)    /usr/local/go/src/pkg/sync/waitgroup.go:79 +0xf2main.main()    /Users/kuankuan/go/src/mreasy/main.go:66 +0x238goroutine 2 [syscall]:created by runtime.main    /usr/local/go/src/pkg/runtime/proc.c:221goroutine 4 [chan receive]:main.dispatcher(0x42115a50,0x0,0x2,0x0)    /Users/kuankuan/go/src/mreasy/main.go:45 +0x223created by main.main    /Users/kuankuan/go/src/mreasy/main.go:65 +0x228exit status 2

谢谢 !

当main goroutine退出时程序终止,因此dispatcher()没有时间做任何事情.您需要在main()中阻塞,直到dispatcher()完成.频道可用于此:
package mainimport (    "fmt"    "os"    "bufio")var done = make(chan bool)             // create channel// Load files and send them into a channel for mappers reading.func dispatcher(arr []string,channel chan string) {    for _,err := os.Open(path)        fmt.Println("begin to dispatch ",_ := reader.ReadString('\n')            channel <- line            i++            if i%200 == 0 {                fmt.Println(i," lines parsed")            }        }        fmt.Println("finish dispatch ",path)    }    done <- true                 // notify main() of completion}func main() {    path := os.Args    if len(path) < 2 {        fmt.Println("Need input files")        os.Exit(0)    }    channel := make(chan string)    fmt.Println("before dispatcher")    go dispatcher(path[1:],channel)    <-done                 // wait for dispatcher()    fmt.Println("after dispatcher")}
总结

以上是内存溢出为你收集整理的Golang goroutine不与内部频道一起运行全部内容,希望文章能够帮你解决Golang goroutine不与内部频道一起运行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1293781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存