Guest User

Untitled

a guest
Oct 20th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.76 KB | None | 0 0
  1. package main
  2.  
  3. /// Zero Time Cacheの簡易実装
  4. /// 重い処理 (Update()関数の後半部分で行われる処理)を無駄に実行しないように制御するためのパターン
  5.  
  6. import (
  7. "fmt"
  8. "strings"
  9. "sync"
  10. "time"
  11. )
  12.  
  13. var (
  14. DoneFlag = false
  15. DoneChan = make(chan bool)
  16. keywords []string
  17.  
  18. wg = &sync.WaitGroup{}
  19.  
  20. KeywordLock sync.Mutex // キーワード追加処理用
  21. ZeroTimeCacheLock sync.Mutex // Zero Time Cache用
  22. LastUpdated time.Time
  23. )
  24.  
  25. func InsertNewKeyword(keyword string) {
  26. for { // 同時呼び出し
  27. if DoneFlag {
  28. break
  29. }
  30. }
  31.  
  32. KeywordLock.Lock()
  33. keywords = append(keywords, keyword) // ここで新しいキーワードを追加
  34. KeywordLock.Unlock()
  35.  
  36. Update() // 更新処理を呼び出す
  37. wg.Done()
  38. }
  39.  
  40. func Update() {
  41. beforeLockTime := time.Now()
  42.  
  43. ZeroTimeCacheLock.Lock()
  44. defer ZeroTimeCacheLock.Unlock()
  45.  
  46. if LastUpdated.After(beforeLockTime) { // 最後に更新した時刻(厳密には、最後に更新を開始した時刻)は、ロック取得前の時刻(キーワード更新後の時刻)よりも後であるか
  47. return // 更新の必要はない
  48. }
  49. LastUpdated = time.Now() // 最終更新時刻を更新
  50.  
  51. fmt.Printf("[UPDATE] %s\n", strings.Join(keywords, ","))
  52. }
  53.  
  54. // 同時実行のための関数(無視して良い)
  55. func SimultaneouslyExecutor() {
  56. <-DoneChan
  57. DoneFlag = true
  58. }
  59.  
  60. func main() {
  61. // A,B,C,D,E,F(順不同)が出力されるのが1回であれば、成功(バッチ的に処理できている)
  62.  
  63. wg.Add(1)
  64. go InsertNewKeyword("A")
  65. wg.Add(1)
  66. go InsertNewKeyword("B")
  67. wg.Add(1)
  68. go InsertNewKeyword("C")
  69. wg.Add(1)
  70. go InsertNewKeyword("D")
  71. wg.Add(1)
  72. go InsertNewKeyword("E")
  73. wg.Add(1)
  74. go InsertNewKeyword("F")
  75.  
  76. go SimultaneouslyExecutor()
  77.  
  78. // Notify
  79. DoneChan <- true
  80.  
  81. // Wait
  82. wg.Wait()
  83. }
Add Comment
Please, Sign In to add comment