golang常駐後台類worker模板

2021-10-23 22:35:01 字數 2366 閱讀 1098

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將程序設定為前台程序,做前台服務,優先順序和前台應用乙個級別,除非在系統記憶體非常缺,否則此程序不會...