-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathWorkerPools.go
51 lines (45 loc) · 1.11 KB
/
WorkerPools.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// WorkerPools
package main
import (
"fmt"
"time"
)
//implement a worker pool using goroutines and channels.
/*
Here is the worker,
of which we will run several concurrent instances.
These workers will receive work on the jobs channel
and send the corresponding results on results.
We will 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, "processing job", j)
time.Sleep(time.Second)
results <- j * 2
}
}
func WorkerPools_() {
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)
}
for j := 1; j <= 9; j++ {
jobs <- j
}
close(jobs)
for a := 1; a <= 9; a++ {
<-results
}
/*
Our running program shows the 9 jobs being executed
by various workers. The program only takes about 3 seconds
despite doing about 9 seconds of total work
because there are 3 workers operating concurrently.
*/
}