diff --git a/hub/executor/concurrent_load_limit.go b/hub/executor/concurrent_load_limit.go new file mode 100644 index 00000000..45f5ce9f --- /dev/null +++ b/hub/executor/concurrent_load_limit.go @@ -0,0 +1,5 @@ +//go:build !386 && !amd64 && !arm64 && !arm64be && !mipsle && !mips + +package executor + +const concurrentCount = 5 diff --git a/hub/executor/concurrent_load_single.go b/hub/executor/concurrent_load_single.go new file mode 100644 index 00000000..603d38f1 --- /dev/null +++ b/hub/executor/concurrent_load_single.go @@ -0,0 +1,5 @@ +//go:build mips || mipsle + +package executor + +const concurrentCount = 1 diff --git a/hub/executor/concurrent_load_unlimit.go b/hub/executor/concurrent_load_unlimit.go new file mode 100644 index 00000000..fded7e56 --- /dev/null +++ b/hub/executor/concurrent_load_unlimit.go @@ -0,0 +1,7 @@ +//go:build 386 || amd64 || arm64 || arm64be + +package executor + +import "math" + +const concurrentCount = math.MaxInt diff --git a/hub/executor/executor.go b/hub/executor/executor.go index fe512109..4bad0469 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -78,8 +78,8 @@ func ApplyConfig(cfg *config.Config, force bool) { updateRules(cfg.Rules, cfg.RuleProviders) updateSniffer(cfg.Sniffer) updateHosts(cfg.Hosts) - updateDNS(cfg.DNS) initInnerTcp() + updateDNS(cfg.DNS) loadProxyProvider(cfg.Providers) updateProfile(cfg) loadRuleProvider(cfg.RuleProviders) @@ -211,12 +211,15 @@ func loadProvider(pv provider.Provider) { func loadRuleProvider(ruleProviders map[string]provider.RuleProvider) { wg := sync.WaitGroup{} + ch := make(chan struct{}, concurrentCount) for _, ruleProvider := range ruleProviders { ruleProvider := ruleProvider wg.Add(1) + ch <- struct{}{} go func() { - defer func() { wg.Done() }() + defer func() { <-ch; wg.Done() }() loadProvider(ruleProvider) + }() } @@ -224,12 +227,15 @@ func loadRuleProvider(ruleProviders map[string]provider.RuleProvider) { } func loadProxyProvider(proxyProviders map[string]provider.ProxyProvider) { + // limit concurrent size wg := sync.WaitGroup{} + ch := make(chan struct{}, concurrentCount) for _, proxyProvider := range proxyProviders { proxyProvider := proxyProvider wg.Add(1) + ch <- struct{}{} go func() { - defer func() { wg.Done() }() + defer func() { <-ch; wg.Done() }() loadProvider(proxyProvider) }() }