timer.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. // программа засыпает на заданное время
  8. // time.Sleep(time.Second * 2)
  9. // func After(d Duration) <-chan Time
  10. // создает канал, который через заданное время вернет значение
  11. //timer := time.After(time.Second)
  12. //<-timer // значение будет получено из канала ровно через 1 секунду
  13. // func Tick(d Duration) <-chan Time
  14. // создает канал, который будет посылать сигналы постоянно через
  15. // заданный промежуток времени
  16. /*
  17. ticker := time.Tick(time.Second)
  18. count := 0
  19. for {
  20. <-ticker
  21. fmt.Println("очередной тик")
  22. count++
  23. if count == 3 {
  24. break
  25. }
  26. }
  27. */
  28. // ---------------------------------------------------------------
  29. // type Timer
  30. // Таймер по своей сути очень похож на результат работы After, но
  31. // позволяет остановить или изменить время его выполнения:
  32. // создаем новый таймер, который сработает через 1 секунду
  33. /*
  34. t := time.NewTimer(time.Second)
  35. fo func() {
  36. <-t.C // C - канал, который должен вернуть значение через заданное время
  37. }()
  38. t.Stop()
  39. */
  40. // пока таймер не сработал, мы может сбросить его, установив новый
  41. // срок выполнения
  42. // t.Reset(time.Second * 2)
  43. // <-t.C
  44. // ---------------------------------------------------------------
  45. // type Ticker
  46. // Ticker же работает как функция Tick, но может быть остановлен:
  47. /*
  48. func NewTicker(d Duration) *Ticker // создаем новый Ticker
  49. func (t *Ticker) Stop() // останавливаем Ticker
  50. */
  51. func main() {
  52. // <-work()
  53. tick := time.NewTicker(time.Second)
  54. defer tick.Stop()
  55. wg := new(sync.WaitGroup)
  56. for i := 1; i <= 5; i++ {
  57. wg.Add(1)
  58. go worker(i, tick.C, wg)
  59. }
  60. wg.Wait()
  61. }
  62. func work() <-chan struct{} {
  63. done := make(chan struct{}) // канал для синхронизации горутин
  64. go func() {
  65. // синхронизирующий канал будет закрыт,
  66. // когда функция завершит свою работу
  67. defer close(done)
  68. stop := time.NewTimer(time.Second)
  69. tick := time.NewTicker(time.Millisecond * 200)
  70. // освободим ресурсы, при завершении работы функции
  71. defer tick.Stop()
  72. for {
  73. select {
  74. case <-stop.C:
  75. // stop - Timer, который через 1 секунду даст
  76. // сигнал завершить работу
  77. return
  78. case <-tick.C:
  79. // tick -Ticker, посылающий сигнал выполнить
  80. // работу каждые 200 миллисекунд
  81. fmt.Println("тик-так")
  82. }
  83. }
  84. }()
  85. return done
  86. }
  87. func worker(id int, limit <-chan time.Time, wg *sync.WaitGroup) {
  88. defer wg.Done()
  89. <-limit
  90. fmt.Printf("worker %d выполнил работу\n", id)
  91. }