2017-05-11 5 views
0

Go에서 시간 초과가있는 PE 파일을 열어 봅니다. 이를 위해 익명 함수를 사용하여 파일 포인터와 오류를 쏟아 내고 있습니다. timeout case와 함께 select 절을 사용하여 아래와 같이 타임 아웃을 적용합니다.golang에서 시간 제한을 사용하여 PE 파일 열기

go func() { 
    f, e := pe.Open(filePath) 
    file <- f 
    err <- e 
}() 

select { 
case <-fileOpenTimeout: 
    fmt.Printf("ERROR: Opening PE file timed out") 
    return 
case fileError := <-err: 
    if fileError == nil{...} 
} 

이 코드는 사용 사례에 따라 잘 작동합니다. 그러나 파일을 열 때 시간이 너무 오래 걸리면 리소스가 누출 될 수 있습니다. 이 문제를 어떻게 방지 할 수 있습니까? PE 파일을 열 때 제한 시간을 적용하는 더 좋은 방법이 있습니까?

답변

0

익명 func에 전달 된 완료 채널이있는 경우이를 사용하여 일찍 종료 한 신호를 보낼 수 있습니다.

func asd() { 
    fileOpenTimeout := time.After(5 * time.Second) 

    type fileResponse struct { 
     file *pe.File 
     err error 
    } 

    response := make(chan fileResponse) 
    done := make(chan struct{}) 

    go func(done <-chan struct{}) { 
     f, e := pe.Open(filePath) 
     r := fileResponse{ 
      file: f, 
      err: e, 
     } 

     select { 
     case response <- r: 
      // do nothing, response sent 
     case <-done: 
      // clean up 
      if f != nil { 
       f.Close() 
      } 
     } 
    }(done) 

    select { 
    case <-fileOpenTimeout: 
     fmt.Printf("ERROR: Opening PE file timed out") 
     close(done) 
     return 
    case r := <-response: 
     if r.err != nil { ... } 
    } 
} 

완료된 채널을 닫으면 항상 0 값을 읽을 수 있습니다. 따라서 익명의 기능은 누출되지 않습니다. 이동 루틴에서 여러 값을 다시 전달하는 것을 단순화하는 함수에만 적용되는 struct fileResponse도 있습니다.

관련 문제