Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- /// Zero Time Cacheの簡易実装
- /// 重い処理 (Update()関数の後半部分で行われる処理)を無駄に実行しないように制御するためのパターン
- import (
- "fmt"
- "strings"
- "sync"
- "time"
- )
- var (
- DoneFlag = false
- DoneChan = make(chan bool)
- keywords []string
- wg = &sync.WaitGroup{}
- KeywordLock sync.Mutex // キーワード追加処理用
- ZeroTimeCacheLock sync.Mutex // Zero Time Cache用
- LastUpdated time.Time
- )
- func InsertNewKeyword(keyword string) {
- for { // 同時呼び出し
- if DoneFlag {
- break
- }
- }
- KeywordLock.Lock()
- keywords = append(keywords, keyword) // ここで新しいキーワードを追加
- KeywordLock.Unlock()
- Update() // 更新処理を呼び出す
- wg.Done()
- }
- func Update() {
- beforeLockTime := time.Now()
- ZeroTimeCacheLock.Lock()
- defer ZeroTimeCacheLock.Unlock()
- if LastUpdated.After(beforeLockTime) { // 最後に更新した時刻(厳密には、最後に更新を開始した時刻)は、ロック取得前の時刻(キーワード更新後の時刻)よりも後であるか
- return // 更新の必要はない
- }
- LastUpdated = time.Now() // 最終更新時刻を更新
- fmt.Printf("[UPDATE] %s\n", strings.Join(keywords, ","))
- }
- // 同時実行のための関数(無視して良い)
- func SimultaneouslyExecutor() {
- <-DoneChan
- DoneFlag = true
- }
- func main() {
- // A,B,C,D,E,F(順不同)が出力されるのが1回であれば、成功(バッチ的に処理できている)
- wg.Add(1)
- go InsertNewKeyword("A")
- wg.Add(1)
- go InsertNewKeyword("B")
- wg.Add(1)
- go InsertNewKeyword("C")
- wg.Add(1)
- go InsertNewKeyword("D")
- wg.Add(1)
- go InsertNewKeyword("E")
- wg.Add(1)
- go InsertNewKeyword("F")
- go SimultaneouslyExecutor()
- // Notify
- DoneChan <- true
- // Wait
- wg.Wait()
- }
Add Comment
Please, Sign In to add comment