Created
March 22, 2020 07:57
-
-
Save ambalabanov/a9935dfb6ae9c2779b794a3d2411d876 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "fmt" | |
import "time" | |
// These workers will receive work on the `jobs` channel and send the corresponding | |
// results on `results`. We'll sleep a second per job to simulate an expensive task. | |
func worker(id int, jobs <-chan int, results chan<- int) { | |
for j := range jobs { | |
fmt.Println("worker", id, "started job", j) | |
time.Sleep(time.Second) | |
fmt.Println("worker", id, "finished job", j) | |
results <- j * 2 | |
} | |
} | |
func main() { | |
// Two channels - to send them work and to collect their results. | |
jobs := make(chan int, 100) | |
results := make(chan int, 100) | |
// This starts up 3 workers, initially blocked because there are no jobs yet. | |
for w := 1; w <= 3; w++ { | |
go worker(w, jobs, results) | |
} | |
// Here we send 5 `jobs` and then `close` that channel to indicate that's all the work we have. | |
for j := 1; j <= 5; j++ { | |
jobs <- j | |
} | |
close(jobs) | |
// collect all the results of the work. | |
for a := 1; a <= 5; a++ { | |
<-results | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment