Skip to content

Instantly share code, notes, and snippets.

@justinschuldt
Created November 11, 2021 22:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save justinschuldt/24c5a9be2218e66cfcf528c45d4cb6b4 to your computer and use it in GitHub Desktop.
Save justinschuldt/24c5a9be2218e66cfcf528c45d4cb6b4 to your computer and use it in GitHub Desktop.
golang parallel async tasks, results via channel
package main
import (
"fmt"
"time"
)
type QueryResult struct {
key string
result string
}
func main() {
// runs taks in parallel,
// publishes results to a channel,
// loops to pull data from the channel, to collect results.
start := time.Now()
queries := map[string]string{
"a": "...",
"b": "...",
"c": "...",
}
numQueries := len(queries)
resultChan := make(chan QueryResult)
for key, query := range queries {
go func(k, q string) {
fmt.Printf("Going to query for key %s...\n", k)
// sleep to mock a long running task
time.Sleep(time.Duration(2) * time.Second)
res := QueryResult{ key: k, result: "result" }
resultChan <- res
}(key, query)
}
results := map[string]string{}
for i := 0; i < numQueries; i++ {
res := <-resultChan
results[res.key] = res.result
}
fmt.Println("collected results:", results)
fmt.Println("took", time.Since(start))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment