2013-08-19 3 views
1

난 그냥 Golang를 따기 시작으로 탈출하는 내가 time.Sleep()에서 휴식을 알아낼 수 없습니다 어떻게... 몇 일 전 time.Sleep

내가 반환 할 수 있습니다/for 루프에서 빠져 나오지 만, Sleep이 계속해서 그 일을하기 때문에 함수는 돌아 오지 않을 것이다.

나는 해결책이 매우 간단하다고 생각하지만 답변을 찾지 못하는 것 같습니다.

func main() { 
    ticker := time.NewTicker(time.Second * 1) 

    go func() { 
    for i := range ticker.C { 
     fmt.Println("tick", i) 
     ticker.Stop() 
     break 
    } 
    }() 
    time.Sleep(time.Second * 10) 
     ticker.Stop() 

    fmt.Println("Hello, playground") 
} 

미리 감사드립니다.

답변

6

에 소리가 필요합니다. 이를 위해서는 채널이 가장 좋은 방법입니다. http://play.golang.org/p/5NFsvC5f7P

타이머 시세보다 큰지에

func main() { 
    ticker := time.NewTicker(time.Second) 
    done := make(chan bool, 1) 

    go func() { 
     for i := range ticker.C { 
      fmt.Println("tick", i) 
      ticker.Stop() 
      break 
     } 

     done <- true 
    }() 

    timer := time.NewTimer(time.Second/2) 
    select { 
    case <-done: 
     timer.Stop() 
    case <-timer.C: 
     ticker.Stop() 
    } 

    fmt.Println("Done") 
} 

동작 예, 그것은 틱. 그것이 적을 때, 당신이 보는 모든 것은 "완료"입니다.

+0

응답 해 주셔서 감사합니다! – davissp14

+0

나는 당신이 준 예제처럼 채널을 추가하여 문제를 해결했다. 그렇다면 간단히 말해서 : if! <- 완료; 자다...; 그렇지 않으면 돌아온다. – davissp14

+0

@ davissp14, 루프는 이것을 수행하는 오히려 해커 한 방법입니다. 내 예를 들어, 모든 것을 자주 확인하는 대신 변경 사실을 통보받습니다. –

0

매우 구체적인 해결책은 아니지만 적용 할 수 있습니다.

내가 이해하는 방식은 특정 조건에서 타이머를 벗어나야한다는 것입니다.

은 수면 주위에 while 루프를 넣어이

while (condition_to_sleep) 
{ 
    time.Sleep(1000); 
} 

당신이 타이머 때 벗어날 수 있습니다이 방법은 당신의 FUNC에 부울로 조건을 설정 두 번째

잠을 만들기 위해 노력 당신은 당신이 주요 goroutine에게 다른 goroutine이 완료를 알리는 메시지를 보낼처럼

희망이 도움 :)

+1

이것은 모든 언어의 동시성을 처리하는 잘못된 방법입니다. Downvote –

+1

이것은 C가 아닙니다. (1) while과 (2) 같은 중괄호가 같은 줄에 없기 때문에 코드가 컴파일되지 않습니다. –