你正在為一家網際網路金融公司的風控部門開發一個風險控制系統。該系統需要定期對一些指標進行檢查,
例如客戶的逾期還款率、
平臺的資金流動情況等,以便及時發現並處理風險。
我們已經為您提供了一個名為schedule的排程器類,該類可以用來執行定期的任務。在這個類中,
我們定義了一個start方法用來啟動一個定期任務,以及一個stop方法用來停止一個正在執行的任務。
你的任務是完成start和stop兩個方法,要求如下:
start方法應該在一個新的協程中啟動定期任務。
任務的執行週期由ticker欄位控制,
任務的執行函式由jobFunc欄位指定,
函式的引數由jobParams欄位提供。
在每個週期開始時,都應該呼叫jobFunc函式,並向其傳遞jobParams作為引數。
如果在start方法執行過程中,從stopCh通道收到了一個訊息,則應該停止任務,並退出協程。
stop方法應該向stopCh通道傳送一個訊息,以便讓start方法停止執行定期任務。在傳送訊息後,
應該呼叫ticker.Stop方法停止定時器。
package main
import (
"fmt"
"time"
)
/*
*/
// type callJobFuncWithParams func(jobFunc interface{}, ...params interface{}) // 一個mock方法,用於模擬各種具體操作
type schedule struct {
stopCh chan struct{}
jobFunc interface{}
jobParams []interface{}
ticker *time.Ticker
running bool
}
func newSchedule(period time.Duration, jobFunc interface{}, params ...interface{}) *schedule {
return &schedule{
stopCh: make(chan struct{}),
jobFunc: jobFunc,
jobParams: params,
ticker: time.NewTicker(period),
}
}
// 請完成下面兩個函式
func (s *schedule) start() {
go func() {
for {
select {
case <-s.ticker.C:
s.jobFunc.(func(params []interface{}))(s.jobParams)
case <-s.stopCh:
s.ticker.Stop()
return
default:
}
}
}()
}
func (s *schedule) stop() {
s.stopCh <- struct{}{}
}
func main() {
sc := newSchedule(time.Second, func(params []interface{}) {
fmt.Printf("par=%+v\n", params)
}, 1, 2)
sc.start()
time.Sleep(time.Second * 3)
sc.stop()
}