你正在为一家互联网金融公司的风控部门开发一个风险控制系统。该系统需要定期对一些指标进行检查,
例如客户的逾期还款率、
平台的资金流动情况等,以便及时发现并处理风险。
我们已经为您提供了一个名为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()
}
标签:schedule,编程,interface,任务,jobFunc,go,ticker,start
From: https://www.cnblogs.com/gdut17code/p/18237496