2015-07-31 14 views
5

tôi làm cho mã kiểm tra dưới đây (gotest.go)golang time.Sleep bug?

package main 

import (
    "fmt" 
    "time" 
    "sync" 
)   

func main() { 
    var wg sync.WaitGroup 
    wg.Add(1) 
    go testa()  

    wg.Wait() 
} 

func testa() { 
    for { 
     fmt.Println("test goroutine") 
     time.Sleep(2 * time.Second) 
    } 
} 

console

go run gotest.go 

và, thay đổi máy tính của tôi ngày (ví dụ: 2015/07/30 -> 2015/07/29)

và sau đó, println not printed !!

là lỗi ??

(đang hoạt động để đặt ngày hôm sau)

Tôi sử dụng phiên bản mới nhất của MacO. Cảm ơn bạn.

+0

Tôi không có hành vi như vậy trên máy tính Windows. Có lẽ đó là một lỗi trên máy Unix, gây ra ví dụ bằng cách sử dụng thời gian comparsion trong time.Sleep chức năng – RoninDev

Trả lời

5

ngủ Bên trong được thực hiện với thời gian tuyệt đối: nếu bạn gọi Sleep(n) lúc T chương trình được lên kế hoạch không để thức dậy saun thời gian, nhưng tại thời gian T + n.

này nói chung là thích hợp hơn vì:

  • thời gian thường không chảy ngược

  • do hệ điều hành kế hoạch trì hoãn một chương trình mà nhiều lần ngủ có thể tụt hậu so với tiến độ vô thời hạn; sử dụng thời gian tuyệt đối làm cho nó bù đắp cho sự chậm trễ bằng cách ngủ trong khoảng thời gian ngắn hơn.

Trong trường hợp của bạn, bạn chỉ phải chờ một ngày để chương trình bắt đầu in lại. : D

Hoặc đặt thời gian chỉ một chút trong quá khứ (nói 15 giây) và xem chương trình tiếp tục sau 15 + 2 giây.

PS. Để làm rõ những gì xảy ra với ví dụ:

Tại 2016-08-25 16:27:12 chương trình gọi time.Sleep(2 * time.Second) Thời gian chạy lên lịch trình goroutine được đánh thức vào ngày 2016-08-25 lúc 16:27:14 và đặt goroutine ngủ

trong khi đó ...

người dùng đặt thời gian hệ thống để 2016-08- 16:27:13

bây giờ là thời gian chờ dự kiến ​​sẽ hết hạn một ngày và một giây sau.

Điều này không nên xảy ra trên các hệ thống, mà Go sử dụng POSIX CLOCK_MONOTONIC hoặc tương đương chúng.

+1

Cảm ơn bạn đã bình luận của bạn! – user2139281

+0

Nhưng điều này không đúng, hay tôi nhớ điều gì đó? Đây là các tài liệu cho 'time.Sleep': (https://golang.org/pkg/time/#Sleep) _Sleep tạm dừng goroutine hiện tại trong ít nhất thời gian d. Thời gian âm hoặc không bằng 0 khiến cho Sleep trở lại ngay lập tức_ –

+0

Tôi đã xác minh và 'time.Sleep (1 * lần.Thứ hai) 'thực sự đặt goroutine của tôi ngủ trong 1 giây. –