func pluginCheck(plugins *Plugins) (bool, string) {
// plugins.GetPluginNumber()获取插件的数量
infoChan := make(chan PluginMessage, plugins.GetPluginNumber())
errChan := make(chan error, 1)
done := make(chan bool, 1)
wg := sync.WaitGroup{}
//并发执行插件中的检查
for name, plugin := range plugins.PluginMap {
wg.Add(1)
go func(plugin PluginChecker, name string) {
defer wg.Done()
//插件的方法
ok, reson, err := plugin.DoCheck()
if err != nil {
errChan <- err
return
}
infoChan <- PluginMessage{
PluginName: name,
GoodCheck: ok,
Message: reson,
}
}(plugin, name)
}
go func() {
wg.Wait()
close(infoChan)
close(done)
}()
select {
case <-done:
for info := range infoChan {
if !info.GoodCheck {
return info.GoodCheck, info.Message
}
}
case err := <-errChan:
return false, err.Error()
}
return true, ""
}