Добромир обнови решението на 13.11.2016 18:50 (преди над 1 година)
+package main
+
+type Result struct {
+ index int
+ result string
+}
+
+func ConcurrentRetryExecutor(tasks []func() string, concurrentLimit int, retryLimit int) <-chan Result {
+ resultChan, limitChan := make(chan Result), make(chan interface{}, concurrentLimit)
+ syncChan := make(chan struct{}, 1)
+ tasksDone := 0
+
+ for i, task := range tasks {
+
+ go func(index int, task func() string) {
+ limitChan <- struct{}{}
+ result := ""
+
+ for i := 0; i < retryLimit && result == ""; i++ {
+ result = task()
+ resultChan <- Result{index, result}
+ }
+ <-limitChan
+
+ syncChan <- struct{}{}
+ tasksDone++
+ if tasksDone == len(tasks) {
+ close(resultChan)
+ }
+ <-syncChan
+ }(i, task)
+ }
+
+ return resultChan
+}
Не се грижиш да се изпълняват последователно задачите - съмнявам се че ти минават и примерните тестове.
Принципно не сме прешодавали именувани типове и бих предпочел ако не ги ползвате