package workerpools import ( "time" "go_dreamfactory/lego/utils/mapstructure" ) type Option func(*Options) type Options struct { DefWrokers int MaxWorkers int Tasktimeout time.Duration //任务执行操超时间 IdleTimeoutSec time.Duration //超时释放空闲工作人员 } func SetDefWorkers(v int) Option { return func(o *Options) { o.DefWrokers = v } } func SetMaxWorkers(v int) Option { return func(o *Options) { o.MaxWorkers = v } } func SetTaskTimeOut(v time.Duration) Option { return func(o *Options) { o.Tasktimeout = v } } func newOptions(config map[string]interface{}, opts ...Option) Options { options := Options{ DefWrokers: 10, MaxWorkers: 20, Tasktimeout: time.Second * 3, } if config != nil { mapstructure.Decode(config, &options) } for _, o := range opts { o(&options) } if options.DefWrokers < 1 { options.DefWrokers = 10 } if options.MaxWorkers < 1 { options.MaxWorkers = 20 } if options.Tasktimeout < time.Millisecond { options.Tasktimeout = time.Second * 3 } if options.IdleTimeoutSec < time.Second*5 { options.IdleTimeoutSec = time.Second * 5 } return options } func newOptionsByOption(opts ...Option) Options { options := Options{ DefWrokers: 10, MaxWorkers: 20, Tasktimeout: time.Second * 3, } for _, o := range opts { o(&options) } if options.DefWrokers < 1 { options.DefWrokers = 10 } if options.MaxWorkers < 1 { options.MaxWorkers = 20 } if options.Tasktimeout < time.Millisecond { options.Tasktimeout = time.Second * 3 } if options.IdleTimeoutSec < time.Second*5 { options.IdleTimeoutSec = time.Second * 5 } return options }