Решение на Concurrent Retry Executor от Николай Бабулков

Обратно към всички решения

Към профила на Николай Бабулков

Резултати

  • 1 точка от тестове
  • 0 бонус точки
  • 1 точка общо
  • 1 успешни тест(а)
  • 8 неуспешни тест(а)

Код

package main
type Result struct {
index int
result string
}
func ConcurrentRetryExecutor(tasks []func() string, concurrentLimit int, retryLimit int) <-chan Result {
limit := make(chan struct{}, concurrentLimit+1)
limit <- struct{}{}
resultsChan := make(chan Result)
go func() {
for idx, task := range tasks {
go func(currTask func() string, currIdx int) {
limit <- struct{}{}
for i := 0; i < retryLimit; i++ {
var resultStr string = currTask()
resultsChan <- Result{currIdx, resultStr}
<-limit
if resultStr != "" {
break
}
}
if len(limit) == 0 {
close(limit)
close(resultsChan)
}
}(task, idx)
}
}()
return resultsChan
}

Лог от изпълнението

▸ Покажи лога

История (2 версии и 2 коментара)

Николай обнови решението на 15.11.2016 12:44 (преди над 1 година)

▸ Покажи разликите
+package main
+
+type Result struct {
+ index int
+ result string
+}
+
+func ConcurrentRetryExecutor(tasks []func() string, concurrentLimit int, retryLimit int) <-chan Result {
+ limit := make(chan struct{}, concurrentLimit+1)
+ limit <- struct{}{}
+ resultsChan := make(chan Result)
+
+ for idx, task := range tasks {
+
+ go func(currTask func() string, currIdx int) {
+ limit <- struct{}{}
+ //fmt.Println("Begin ", currIdx+1)
+ for i := 0; i < retryLimit; i++ {
+ var resultStr string = currTask()
+ resultsChan <- Result{currIdx, resultStr}
+ <-limit
+ if resultStr != "" {
+ break
+ }
+ }
+ if len(limit) == 0 {
+ close(limit)
+ close(resultsChan)
+ }
+ }(task, idx)
+ }
+ return resultsChan
+}

Николай обнови решението на 15.11.2016 14:35 (преди над 1 година)

▸ Покажи разликите
package main
type Result struct {
index int
result string
}
func ConcurrentRetryExecutor(tasks []func() string, concurrentLimit int, retryLimit int) <-chan Result {
limit := make(chan struct{}, concurrentLimit+1)
limit <- struct{}{}
resultsChan := make(chan Result)
- for idx, task := range tasks {
-
- go func(currTask func() string, currIdx int) {
- limit <- struct{}{}
- //fmt.Println("Begin ", currIdx+1)
- for i := 0; i < retryLimit; i++ {
- var resultStr string = currTask()
- resultsChan <- Result{currIdx, resultStr}
- <-limit
- if resultStr != "" {
- break
+ go func() {
+ for idx, task := range tasks {
+ go func(currTask func() string, currIdx int) {
+ limit <- struct{}{}
+ for i := 0; i < retryLimit; i++ {
+ var resultStr string = currTask()
+ resultsChan <- Result{currIdx, resultStr}
+ <-limit
+ if resultStr != "" {
+ break
+ }
}
- }
- if len(limit) == 0 {
- close(limit)
- close(resultsChan)
- }
- }(task, idx)
- }
+ if len(limit) == 0 {
+ close(limit)
+ close(resultsChan)
+ }
+
+ }(task, idx)
+ }
+ }()
return resultsChan
}