monolithic kernel

golang で cron、setlock を添えて

October 09, 2015

    golang で cron みたいなことをやるライブラリはすでに存在していて、使うだけの話ではあるんですけど、その際に setlock 的なものを噛ませたかったので書いてみました。プロセスを跨がなかったら簡単な話ですね。ただ、Mutex に TryLock 相当の機能が無かったので、ロックを獲得できなかったら処理しないバージョンについては Compare-and-Swap でやっています。

    package main
    
    import (
    	"github.com/robfig/cron"
    	"sync"
    	"sync/atomic"
    )
    
    func main() {
    	cron := cron.New()
    
    	// setlock 風味
    	// すでに実行中だったら終わるまで待ってから実行
    	mutex := &sync.Mutex{}
    	cron.AddFunc("* * * * *", func() {
    		mutex.Lock()
    		defer mutex.Unlock()
    
    		// ...
    	})
    
    	// setlock -nx 風味
    	// すでに実行中だったら何もせずに終了
    	var running int32 = 0
    	cron.AddFunc("* * * * *", func() {
    		if atomic.CompareAndSwapInt32(&running, 0, 1) {
    			defer atomic.StoreInt32(&running, 0)
    
    			// ...
    		}
    	})
    
    	cron.Start()
    
    	select {}
    }