Слави обнови решението на 15.11.2016 12:05 (преди над 1 година)
+package main
+
+func scheduler(tasks []func() string, limit int, retries int, output chan<- struct {
+ index int
+ result string
+}) {
+ semaphore := make(chan struct{}, limit)
+ for index, task := range tasks {
+ semaphore <- struct{}{}
+ go func(index int, task func() string) {
+ defer func() {
+ <-semaphore
+ }()
+ for i := 0; i < retries; i++ {
+ result := task()
+ output <- struct {
+ index int
+ result string
+ }{index, result}
+ if result != "" {
+ return
+ }
+ }
+ }(index, task)
+ }
+
+ go func() {
това е в отделна горутина защото ?
Защото го писах полу-заспал :D
+ for i := 0; i < limit; i++ {
+ semaphore <- struct{}{}
+ }
+ close(output)
+ }()
+}
+
+func ConcurrentRetryExecutor(tasks []func() string, limit int, retries int) <-chan struct {
+ index int
+ result string
+} {
+ output := make(chan struct {
+ index int
+ result string
+ })
+ go scheduler(tasks, limit, retries, output)
+ return output
+}
това е в отделна горутина защото ?
Защото го писах полу-заспал :D