MCPcopy Create free account
hub / github.com/V2RaySSR/RealityChecker / CheckDomainsWithProgress

Method CheckDomainsWithProgress

internal/batch/manager.go:116–214  ·  view source on GitHub ↗

CheckDomainsWithProgress 带进度显示的并发批量检测

(ctx context.Context, domains []string)

Source from the content-addressed store, hash-verified

114
115// CheckDomainsWithProgress 带进度显示的并发批量检测
116func (bm *Manager) CheckDomainsWithProgress(ctx context.Context, domains []string) ([]*types.DetectionResult, error) {
117 results := make([]*types.DetectionResult, len(domains))
118 resultChan := make(chan *ProgressResult, len(domains))
119
120 // 启动并发检测
121 go func() {
122 defer close(resultChan)
123
124 // 使用WaitGroup控制并发
125 var wg sync.WaitGroup
126
127 // 使用配置的最大并发数,提高检测效率
128 concurrency := int(bm.config.Concurrency.MaxConcurrent) // 使用配置的并发数(默认8个)
129 semaphore := make(chan struct{}, concurrency)
130
131 for i, domain := range domains {
132 wg.Add(1)
133 go func(index int, domain string) {
134 defer wg.Done()
135
136 // 获取信号量
137 select {
138 case semaphore <- struct{}{}:
139 defer func() {
140 <-semaphore
141 }()
142 case <-ctx.Done():
143 return
144 }
145
146 // 检测域名
147 result, err := bm.engine.CheckDomain(ctx, domain)
148
149 // 发送结果
150 select {
151 case resultChan <- &ProgressResult{
152 Index: index,
153 Domain: domain,
154 Result: result,
155 Error: err,
156 }:
157 case <-ctx.Done():
158 return
159 }
160 }(i, domain)
161 }
162
163 wg.Wait()
164 }()
165
166 // 收集结果并显示进度
167 completed := 0
168 timeout := time.NewTimer(15 * time.Second) // 添加15秒总超时
169 defer timeout.Stop()
170
171 for completed < len(domains) {
172 select {
173 case progressResult := <-resultChan:

Callers 1

CheckDomainsMethod · 0.95

Calls 2

CheckDomainMethod · 0.80
StopMethod · 0.45

Tested by

no test coverage detected