Parcourir la source

Make aurInfo concurrent

morganamilo il y a 7 ans
Parent
commit
3f7c731f99
1 fichiers modifiés avec 27 ajouts et 4 suppressions
  1. 27 4
      query.go

+ 27 - 4
query.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"sort"
 	"strings"
+	"sync"
 
 	alpm "github.com/jguer/go-alpm"
 	rpc "github.com/mikkeloscar/aur"
@@ -368,14 +369,36 @@ func min(a, b int) int {
 func aurInfo(names []string) ([]rpc.Pkg, error) {
 	info := make([]rpc.Pkg, 0, len(names))
 	seen := make(map[string]int)
+	var mux sync.Mutex
+	var wg sync.WaitGroup
+	var err error
 
-	for n := 0; n < len(names); n += config.RequestSplitN {
-		max := min(len(names), n + config.RequestSplitN)
-		tempInfo, err := rpc.Info(names[n:max])
+	makeRequest := func(n, max int) {
+		tempInfo, requestErr := rpc.Info(names[n:max])
 		if err != nil {
-			return info, err
+			return
 		}
+		if requestErr != nil {
+			//return info, err
+			err = requestErr
+			return
+		}
+		mux.Lock()
 		info = append(info, tempInfo...)
+		mux.Unlock()
+		wg.Done()
+	}
+
+	for n := 0; n < len(names); n += config.RequestSplitN {
+		max := min(len(names), n + config.RequestSplitN)
+		wg.Add(1)
+		go makeRequest(n, max)
+	}
+
+	wg.Wait()
+
+	if err != nil {
+		return info, err
 	}
 
 	for k, pkg := range info {