CheckDomainsWithProgress 带进度显示的并发批量检测
(ctx context.Context, domains []string)
| 114 | |
| 115 | // CheckDomainsWithProgress 带进度显示的并发批量检测 |
| 116 | func (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: |
no test coverage detected