2016-06-22 7 views
1
func Tick() {                                   
    fmt.Println("startTime", time.Now().Format("2006-01-02 15:04:05"))                     
    t := time.NewTicker(time.Second * 3)                            
    time.Sleep(time.Second * 12)                              
    for {                                    
     stamp := <-t.C                                 
     fmt.Println("tickTime", stamp.Format("2006-01-02 15:04:05"))                     
    }                                     
}   

из выше Задачи и результаты фрагменте кода:Как работает golang ticker?

STARTTIME 2016-06-22 16:22:20

TickTime 2016-06-22 16:22:23

TickTime 2016-06- 22 16:22:35

TickTime 2016-06-22 16:22:38

TickTime 2016-06-22 16:22:41

TickTime 2016-06-22 16:22:44


Почему это случилось с не меткой времени 16:22:26, ​​16:22:29, когда я оттянуть информер?

+0

Где вы управляете этим? Кажется, что это отлично работает для меня: https://play.golang.org/p/3uVTJq9AfN –

+0

@DuruCanCelasun Вы ожидаете только 1 секунду, что меньше длительности тикера. Подождите> продолжительность тика - проблема здесь. – LinearZoetrope

ответ

6

Это источник Ticker (простите номера строк, я скопировал это от исходной страницы документации):

func NewTicker(d Duration) *Ticker { 
      if d <= 0 { 
       panic(errors.New("non-positive interval for NewTicker")) 
      } 
      // Give the channel a 1-element time buffer. 
      // If the client falls behind while reading, we drop ticks 
      // on the floor until the client catches up. 
      c := make(chan Time, 1) 
      t := &Ticker{ 
       C: c, 
       r: runtimeTimer{ 
        when: when(d), 
        period: int64(d), 
        f:  sendTime, 
        arg: c, 
       }, 
      } 
      startTimer(&t.r) 
      return t 
     } 

Примечание комментарий

// Give the channel a 1-element time buffer. 
// If the client falls behind while reading, we drop ticks 
// on the floor until the client catches up. 

Что происходит:

  1. Вы создаете таймер
  2. Таймер производит его с первым тиком и буфером.
  3. Теперь он ждет, просыпается и блокирует, ожидая, пока вы будете потреблять, чтобы он мог производить галочку. 2.
  4. В конце концов ваш goroutine просыпается и сразу же потребляет первые два тика, которые он произвел, и он снова начинает производить тики ,

Edit: Кроме того, справки о для NewTicker (который Tick является функцией удобства для) говорит:

NewTicker возвращает новый тикер, содержащий канал, который будет отправить время с периодом, указанным по аргументу продолжительности. Он регулирует интервалы или снижает количество тиков, чтобы компенсировать медленные приемники. Продолжительность d должна быть больше нуля; если нет, NewTicker будет паниковать. Остановите тикер , чтобы освободить связанные ресурсы.

Хотя он явно не упоминает, что это канал с буфером одного.