golang中經常會用到常駐後台類的worker,實現例如消費佇列、定期執行任務、定期統計資料等功能。
這裡自己實現了通用的worker模板,主要有以下功能:
panic自動重啟,最大重啟次數可自定義。
optional引數,有預設引數和支援自定義引數。
busy模式和idle模式,執行完任務後睡眠不同的時間。
支援以一定的頻率執行,例如每5分鐘執行一次任務。
可動態的通過channel控制任務的啟動和暫停。ps:此處可結合etcd實現分布式選主機制。
支援用context優雅的停止,worker停止後waitgroup通知,超時強停。
package worker
import (
"fmt"
"strings"
"sync"
"time"
"context"
)const (
defaultworkername = "worker"
defaultbusysleeptime = time.millisecond * 100
defaultidlesleeptime = time.second * 1
defaultpanicrecovercount = 5
defaultwaitclosetime = time.second * 5
)type taskfunc func() (idle bool, err error)
type workeroption func(*worker)
type worker struct
waitclosetime time.duration
}func (w *worker) work() else
} if w.wg != nil
}()var (
timer = time.newtimer(time.millisecond)
sleeptime time.duration
) defer timer.stop()
for
var (
done = make(chan struct{})
idle bool
err error
) go func()
close(done)
}()// 優雅的停止,但同時不能無限期的等。(有些任務可能執行很久)
select
return
case <-done:
} if w.taskfrequency > 0 else
} // 停止計時器,清空channel
if !timer.stop() && len(timer.c) > 0
timer.reset(sleeptime)
select }}
func newworker(task taskfunc, opts ...workeroption) (w *worker)
return
}func initworker(task taskfunc) *worker
tmp := make(chan struct{})
w.checkmaster = tmp
close(tmp)
return w
}func withname(name string) workeroption
}// 傳入的channel應該是阻塞式的,如果是leader節點,需要每次判斷都不阻塞。
func withcheckmasterchannel(checkmasterch <-chan struct{}) workeroption
}func withbusysleeptime(t time.duration) workeroption
}func withidlesleeptime(t time.duration) workeroption
}func withwaitclosetime(t time.duration) workeroption
}func withpanicrecovercount(c int) workeroption
}func withcontext(ctx context.context) workeroption
}// 傳入的waitgroup,請在外面呼叫wg.add()
func withwaitgroup(wg *sync.waitgroup) workeroption
}func withtaskfrequency(d time.duration) workeroption
}func dealrecover(r inte***ce{})
iOS常駐後台執行實現
最近重新看ios的開發,確實有一些新的發現 1 短時間常駐 3分鐘 var backgroundtask uibackgroundtaskidentifier nil 申請乙個任務id 該方法在進入後台時響應 如果已存在後台任務,先將其設為完成 if self.backgroundtask nil ...
iOS藍芽APP常駐後台
1.設定plist,藍芽許可權 2.到target capabilities background modes中開啟use bluetooth le accessories選項 3.建立central manager時設定restore identifier bluetoothmanager cbc...
android應用常駐後台,避免被第三方殺掉的方法
應用常駐後台,避免被第三方殺掉的方法 一 service設定成start sticky kill 後會被重啟 等待5秒左右 重傳intent,保持與重啟前一樣 二 通過 startforeground將程序設定為前台程序,做前台服務,優先順序和前台應用乙個級別,除非在系統記憶體非常缺,否則此程序不會...