Last active
May 2, 2016 13:59
-
-
Save hirokazumiyaji/a57ad9c486c91509eb56f9f9ad499f95 to your computer and use it in GitHub Desktop.
Golang Parallel Worker
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" | |
"os" | |
"os/signal" | |
"strconv" | |
"sync" | |
"syscall" | |
) | |
func worker(workerNumber int, wg *sync.WaitGroup, sig <-chan int, valueChannel <-chan int) { | |
fmt.Println("start worker ", workerNumber) | |
for { | |
select { | |
case _ = <- sig: | |
fmt.Println("end worker ", workerNumber) | |
wg.Done() | |
return | |
case v := <-valueChannel: | |
fmt.Println("worker ", workerNumber, " process ", v) | |
} | |
} | |
} | |
func main() { | |
num, _ := strconv.Atoi(os.Argv[1]) | |
workerSignalChannels := make([]chan int, num) | |
for i, _ := range workerSignalChannels { | |
workerSignalChannel[i] = make(chan int) | |
} | |
sig := make(chan os.Signal, 1) | |
signal.Notify( | |
sig, | |
syscall.SIGHUP, | |
syscall.SIGINT, | |
syscall.SIGTERM, | |
syscall.SIGQUIT, | |
) | |
go func() { | |
select { | |
case _ = <- sig: | |
for _, channel := range workerSignalChannels { | |
channel <- 1 | |
} | |
return | |
} | |
}() | |
var wg sync.WaitGroup | |
var valueChannel := make(chan int) | |
wg.Add(num) | |
for i := 0; i < n; i++ { | |
go worker(i, &wg, workerSignalChannels[i], valueChannel) | |
} | |
for i := 1; i < 20; i++ { | |
valueChannel <- i | |
} | |
wg.Done() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment