duanfu9523 2014-12-04 13:02
浏览 25
已采纳

前往:所有goroutine都在睡觉-死锁


I have snippet of code to resizing images.
I'm using resize lib.
Here is the snippet:

package main

import (
    "fmt"
    "github.com/nfnt/resize"
    "image"
    "image/jpeg"
    "os"
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(4)

    file_names := make([]string, 5)
    for i := 1; i < 6; i++ {
        file_names[i-1] = fmt.Sprintf("%v", i)
    }

    c := make(chan string)
    ce := make(chan error)

    for _, filename := range file_names {
        go func() {
            proccesFileName(filename, c, ce)
        }()
    }

    for {
        select {
        case str := <-c:
            fmt.Println(str)
            break
        case err := <-ce:
            fmt.Println(err)
            break
        }
    }
}

And here is my proccesFileName function:

func proccesFileName(filename string, c chan string, ce chan error) {
    file, err := os.Open(fmt.Sprintf("in/%v.jpg", filename))
    if err != nil {
        ce <- err
    }
    defer file.Close()

    img, err := jpeg.Decode(file)
    if err != nil {
        ce <- err
    }

    scales := []float32{1.0, 0.8, 0.6, 0.5, 0.25, 0.01}
    thumbs := make([]image.Image, len(scales))
    for i := 0; i < len(scales); i++ {
        thumbs[i] = resize.Resize(uint(float32(img.Bounds().Max.X)*scales[i]),
            uint(float32(img.Bounds().Max.Y)*scales[i]), img, resize.Lanczos3)

        thumb_name := fmt.Sprintf("out/%v_thumb_%v.jpg", filename, i+1)

        out, err := os.Create(thumb_name)
        if err != nil {
            ce <- err
        }
        defer out.Close()

        jpeg.Encode(out, thumbs[i], nil)

        c <- fmt.Sprintf("%v FINISHED", i)
    }
}

And I have the output:

0 FINISHED
0 FINISHED
0 FINISHED
0 FINISHED
0 FINISHED
1 FINISHED
1 FINISHED
1 FINISHED
2 FINISHED
1 FINISHED
1 FINISHED
2 FINISHED
3 FINISHED
2 FINISHED
2 FINISHED
2 FINISHED
3 FINISHED
4 FINISHED
4 FINISHED
3 FINISHED
5 FINISHED
3 FINISHED
5 FINISHED
3 FINISHED
4 FINISHED
4 FINISHED
4 FINISHED
5 FINISHED
5 FINISHED
5 FINISHED
fatal error: all goroutines are asleep - deadlock!

goroutine 16 [select]:
main.main()
    /home/cnaize/Desktop/test/main.go:30 +0x509

goroutine 19 [finalizer wait]:
runtime.park(0x413ee0, 0x5b2f70, 0x5b1a89)
    /usr/local/go/src/pkg/runtime/proc.c:1369 +0x89
runtime.parkunlock(0x5b2f70, 0x5b1a89)
    /usr/local/go/src/pkg/runtime/proc.c:1385 +0x3b
runfinq()
    /usr/local/go/src/pkg/runtime/mgc0.c:2644 +0xcf
runtime.goexit()
    /usr/local/go/src/pkg/runtime/proc.c:1445
exit status 2

Where may be the problem?

  • 写回答

1条回答 默认 最新

  • duanpacan9388 2014-12-04 15:02
    关注

    You need not to wait indefinitely. You know how messages will be on the channels.

    for _ = range file_names {
        select {
        case str := <-c
            fmt.Println(str)
        case err := <-ce
            fmt.Println(err)
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口