Skip to content

Instantly share code, notes, and snippets.

@hirokazumiyaji
Last active May 2, 2016 13:59
Show Gist options
  • Save hirokazumiyaji/a57ad9c486c91509eb56f9f9ad499f95 to your computer and use it in GitHub Desktop.
Save hirokazumiyaji/a57ad9c486c91509eb56f9f9ad499f95 to your computer and use it in GitHub Desktop.
Golang Parallel Worker
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