Created
March 23, 2020 18:13
-
-
Save jeffotoni/de554b9f981dbfb1d6dcbca5a486c8d5 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
| /* | |
| * Example Worker | |
| * @package main | |
| * @author @jeffotoni | |
| */ | |
| // In this example we'll look at how to implement | |
| // a _worker pool_ using goroutines and channels. | |
| package main | |
| import "fmt" | |
| import "time" | |
| // Here's the worker, of which we'll run several | |
| // concurrent instances. 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() { | |
| // In order to use our pool of workers we need to send | |
| // them work and collect their results. We make 2 | |
| // channels for this. | |
| 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) | |
| // Finally we 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