2014-12-04 4 views
0


이미지의 크기를 조정하는 스 니펫이 있습니다.
나는 resize lib를 사용하고 있습니다. 여기이동 : 모든 골든 루틴은 잠 들어 있습니다 - 교착 상태입니다.

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 
     } 
    } 
} 

그리고 내 proccesFileName 기능입니다 :

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) 
    } 
} 

은 내가 출력이 있습니다

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 

문제가 될 수를 여기에
는 조각인가?

+2

'breaks'는'for'가 아니라'select' 문에서 빠져 나옵니다. 모든 작업자가 완료된 후에도 'for' 루프가 리셋되고 채널에 걸리는 새로운'select'가 생기며 절대 값을받지 못합니다 – Makpoc

답변

1

무한정 기다릴 필요가 없습니다. 메시지가 채널에 어떻게 표시되는지 알 수 있습니다.

for _ = range file_names { 
    select { 
    case str := <-c 
     fmt.Println(str) 
    case err := <-ce 
     fmt.Println(err) 
    } 
} 
관련 문제