Make rule-set initialization parallel

This commit is contained in:
世界
2023-11-30 15:28:08 +08:00
parent bbc1d12015
commit cbe2848d8f
7 changed files with 93 additions and 22 deletions

View File

@@ -39,6 +39,7 @@ import (
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
serviceNTP "github.com/sagernet/sing/common/ntp"
"github.com/sagernet/sing/common/task"
"github.com/sagernet/sing/common/uot"
"github.com/sagernet/sing/service"
"github.com/sagernet/sing/service/pause"
@@ -490,12 +491,24 @@ func (r *Router) Start() error {
if r.needWIFIState {
r.updateWIFIState()
}
ruleSetStartContext := NewRuleSetStartContext()
var ruleSetStartGroup task.Group
for i, ruleSet := range r.ruleSets {
err := ruleSet.Start()
if err != nil {
return E.Cause(err, "initialize rule-set[", i, "]")
}
ruleSetStartGroup.Append0(func(ctx context.Context) error {
err := ruleSet.StartContext(ctx, ruleSetStartContext)
if err != nil {
return E.Cause(err, "initialize rule-set[", i, "]")
}
return nil
})
}
ruleSetStartGroup.Concurrency(5)
ruleSetStartGroup.FastFail()
err := ruleSetStartGroup.Run(r.ctx)
if err != nil {
return err
}
ruleSetStartContext.Close()
for i, rule := range r.rules {
err := rule.Start()
if err != nil {