File tree Expand file tree Collapse file tree 18 files changed +698
-0
lines changed Expand file tree Collapse file tree 18 files changed +698
-0
lines changed Original file line number Diff line number Diff line change 1+ name : Go
2+
3+ on :
4+ push :
5+ branches :
6+ - master
7+ pull_request :
8+ branches :
9+ - master
10+ jobs :
11+ build_and_test :
12+ runs-on : ubuntu-latest
13+ steps :
14+ - name : Setup go-task
15+ uses : pnorton5432/setup-task@v1
16+ with :
17+ task-version : 3.29.1
18+ - name : Checkout
19+ uses : actions/checkout@v4
20+ - name : Setup Go
21+ uses : actions/setup-go@v5
22+ with :
23+ go-version : ' stable'
24+ check-latest : true
25+ - name : Task Build for mage
26+ run : task build-gg
27+ - name : Test with gg build
28+ run : ./gg build
Original file line number Diff line number Diff line change 1+ # If you prefer the allow list template instead of the deny list, see community template:
2+ # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
3+ #
4+ # Binaries for programs and plugins
5+ * .exe
6+ * .exe~
7+ * .dll
8+ * .so
9+ * .dylib
10+
11+ # Test binary, built with `go test -c`
12+ * .test
13+
14+ # Output of the go coverage tool, specifically when used with LiteIDE
15+ * .out
16+
17+ # Dependency directories (remove the comment below to include it)
18+ # vendor/
19+
20+ # Go workspace file
21+ go.work
22+ go.work.sum
23+
24+ # env file
25+ .env
26+ gg
27+ mage
28+ bin
Original file line number Diff line number Diff line change 1+ # golang-sample-with-conc
2+
3+ This repository is demo for use conc with golang concurrency handle
4+
5+ ## install package
6+
7+ ``` shell
8+ go get github.com/sourcegraph/conc
9+ ```
10+
11+ ## samples
12+
13+ [ simple-task] ( ./cmd/simple-task/README.md )
14+
15+ [ pool-sample] ( ./cmd/pool-sample/README.md )
16+
17+ [ aggregate-sample] ( ./cmd/aggregate-sample/README.md )
18+
19+ [ handle-context] ( ./cmd/handle-context/README.md )
20+
21+ [ handle-errors] ( ./cmd/handle-errors/README.md )
Original file line number Diff line number Diff line change 1+ version : ' 3'
2+
3+ tasks :
4+ default :
5+ cmds :
6+ - echo "This is task cmd"
7+ silent : true
8+
9+ # build:
10+ # cmds:
11+ # - CGO_ENABLED=0 GOOS=linux go build -o bin/main cmd/main.go
12+ # silent: true
13+ # run:
14+ # cmds:
15+ # - ./bin/main
16+ # deps:
17+ # - build
18+ # silent: true
19+
20+ build-mage :
21+ cmds :
22+ - CGO_ENABLED=0 GOOS=linux go build -o ./mage mage-tools/mage.go
23+ silent : true
24+
25+ build-gg :
26+ cmds :
27+ - ./mage -d mage-tools -compile ../gg
28+ deps :
29+ - build-mage
30+ silent : true
31+
32+ coverage :
33+ cmds :
34+ - go test -v -cover ./...
35+ silent : true
36+ test :
37+ cmds :
38+ - go test -v ./...
39+ silent : true
40+
Original file line number Diff line number Diff line change 1+ # aggregate-sample
2+
3+ ``` golang
4+ package main
5+
6+ import (
7+ " fmt"
8+ " math/rand"
9+ " time"
10+
11+ " github.com/sourcegraph/conc/pool"
12+ )
13+
14+ // simulateAPI simulates an API call to fetech product prices
15+ func simulateAPI (apiID int ) int {
16+ // Simulate varying response times
17+ rng := rand.New (rand.NewSource (time.Now ().UnixNano ()))
18+
19+ // Generate a random duration
20+ randomDuration := time.Duration (rng.Int63n (int64 (2 * time.Second )))
21+
22+ time.Sleep (randomDuration)
23+
24+ // Return a mock price
25+ return apiID*10 + rand.Intn (10 )
26+ }
27+
28+ func main () {
29+ // Create a result pool
30+ pool := pool.NewWithResults [int ]().WithMaxGoroutines (5 )
31+
32+ // Simulate fetching prices
33+ for apiID := 1 ; apiID <= 10 ; apiID++ {
34+ apiID := apiID // Capture variable for goroutine
35+ pool.Go (func () int {
36+ fmt.Printf (" Fetching price from API %d ...\n " , apiID)
37+ return simulateAPI (apiID)
38+ })
39+ }
40+
41+ // Wait for all API calls to finish
42+ prices := pool.Wait ()
43+ // Display prices in the console
44+ fmt.Printf (" Collected Prices: %v \n " , prices)
45+ }
46+ ```
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "fmt"
5+ "math/rand"
6+ "time"
7+
8+ "github.com/sourcegraph/conc/pool"
9+ )
10+
11+ // simulateAPI simulates an API call to fetech product prices
12+ func simulateAPI (apiID int ) int {
13+ // Simulate varying response times
14+ rng := rand .New (rand .NewSource (time .Now ().UnixNano ()))
15+
16+ // Generate a random duration
17+ randomDuration := time .Duration (rng .Int63n (int64 (2 * time .Second )))
18+
19+ time .Sleep (randomDuration )
20+
21+ // Return a mock price
22+ return apiID * 10 + rand .Intn (10 )
23+ }
24+
25+ func main () {
26+ // Create a result pool
27+ pool := pool .NewWithResults [int ]().WithMaxGoroutines (5 )
28+
29+ // Simulate fetching prices
30+ for apiID := 1 ; apiID <= 10 ; apiID ++ {
31+ apiID := apiID // Capture variable for goroutine
32+ pool .Go (func () int {
33+ fmt .Printf ("Fetching price from API %d...\n " , apiID )
34+ return simulateAPI (apiID )
35+ })
36+ }
37+
38+ // Wait for all API calls to finish
39+ prices := pool .Wait ()
40+ // Display prices in the console
41+ fmt .Printf ("Collected Prices: %v\n " , prices )
42+ }
Original file line number Diff line number Diff line change 1+ # handle-context
2+
3+ ``` golang
4+ package main
5+
6+ import (
7+ " context"
8+ " fmt"
9+ " strings"
10+ " time"
11+
12+ " github.com/sourcegraph/conc/pool"
13+ )
14+
15+ // validateFile simulates file validation. It returns an error for invalid files
16+ func validateFile (fileName string ) error {
17+ if strings.HasPrefix (fileName, " invalid" ) {
18+ return fmt.Errorf (" validation failed for file: %s " , fileName)
19+ }
20+ fmt.Printf (" File %s validated successfully\n " , fileName)
21+ return nil
22+ }
23+ func main () {
24+ // A list of files
25+ files := []string {
26+ " file1.csv" ,
27+ " invalid_file2.csv" ,
28+ " file3.csv" ,
29+ " file4.csv" ,
30+ " invalid_file5.csv" ,
31+ " file6.csv" ,
32+ }
33+
34+ ctx , cancel := context.WithTimeout (context.Background (), 10 *time.Second )
35+ defer cancel ()
36+ // Create a new pool with error handling
37+ pool := pool.New ().WithErrors ().WithContext (ctx).WithMaxGoroutines (2 )
38+
39+ // Add validation tasks for each file
40+ for _ , file := range files {
41+ pool.Go (func (poolCtx context.Context ) error {
42+ twoSecondTimerCh := time.After (2 * time.Second )
43+ select {
44+ case <- poolCtx.Done ():
45+ fmt.Printf (" Task cancelled\n " )
46+ return poolCtx.Err ()
47+ case <- twoSecondTimerCh:
48+ err := validateFile (file)
49+ return err
50+ }
51+ })
52+ }
53+
54+ // Wait for all tasks to finish
55+ if err := pool.Wait (); err != nil {
56+ fmt.Printf (" Error: %v \n " , err)
57+ } else {
58+ fmt.Println (" All files validated successfully" )
59+ }
60+ }
61+
62+ ```
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "context"
5+ "fmt"
6+ "strings"
7+ "time"
8+
9+ "github.com/sourcegraph/conc/pool"
10+ )
11+
12+ // validateFile simulates file validation. It returns an error for invalid files
13+ func validateFile (fileName string ) error {
14+ if strings .HasPrefix (fileName , "invalid" ) {
15+ return fmt .Errorf ("validation failed for file: %s" , fileName )
16+ }
17+ fmt .Printf ("File %s validated successfully\n " , fileName )
18+ return nil
19+ }
20+ func main () {
21+ // A list of files
22+ files := []string {
23+ "file1.csv" ,
24+ "invalid_file2.csv" ,
25+ "file3.csv" ,
26+ "file4.csv" ,
27+ "invalid_file5.csv" ,
28+ "file6.csv" ,
29+ }
30+
31+ ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
32+ defer cancel ()
33+ // Create a new pool with error handling
34+ pool := pool .New ().WithErrors ().WithContext (ctx ).WithMaxGoroutines (2 )
35+
36+ // Add validation tasks for each file
37+ for _ , file := range files {
38+ pool .Go (func (poolCtx context.Context ) error {
39+ twoSecondTimerCh := time .After (2 * time .Second )
40+ select {
41+ case <- poolCtx .Done ():
42+ fmt .Printf ("Task cancelled\n " )
43+ return poolCtx .Err ()
44+ case <- twoSecondTimerCh :
45+ err := validateFile (file )
46+ return err
47+ }
48+ })
49+ }
50+
51+ // Wait for all tasks to finish
52+ if err := pool .Wait (); err != nil {
53+ fmt .Printf ("Error: %v\n " , err )
54+ } else {
55+ fmt .Println ("All files validated successfully" )
56+ }
57+ }
Original file line number Diff line number Diff line change 1+ # handle-errors
2+
3+ ``` golang
4+ package main
5+
6+ import (
7+ " fmt"
8+ " strings"
9+
10+ " github.com/sourcegraph/conc/pool"
11+ )
12+
13+ // validateFile simulates file validation. It returns an error for invalid files
14+ func validateFile (fileName string ) error {
15+ if strings.HasPrefix (fileName, " invalid" ) {
16+ return fmt.Errorf (" validation failed for file: %s " , fileName)
17+ }
18+ fmt.Printf (" File %s validated successfully\n " , fileName)
19+ return nil
20+ }
21+ func main () {
22+ // A list of files
23+ files := []string {
24+ " file1.csv" ,
25+ " invalid_file2.csv" ,
26+ " file3.csv" ,
27+ " file4.csv" ,
28+ " invalid_file5.csv" ,
29+ " file6.csv" ,
30+ }
31+
32+ // Create a new pool with error handling
33+ pool := pool.New ().WithErrors ().WithMaxGoroutines (2 )
34+
35+ // Add validation tasks for each file
36+ for _ , file := range files {
37+ pool.Go (func () error {
38+ return validateFile (file)
39+ })
40+ }
41+
42+ // Wait for all tasks to finish
43+ if err := pool.Wait (); err != nil {
44+ fmt.Printf (" Error: %v \n " , err)
45+ } else {
46+ fmt.Println (" All files validated successfully" )
47+ }
48+ }
49+
50+ ```
You can’t perform that action at this time.
0 commit comments