2018-02-15 09:21:37 +03:00
|
|
|
|
package main
|
|
|
|
|
|
2018-03-01 09:05:15 +03:00
|
|
|
|
// article https://www.ardanlabs.com/blog/2013/05/thread-pooling-in-go-programming.html
|
2018-02-15 09:21:37 +03:00
|
|
|
|
import (
|
|
|
|
|
"bufio"
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
"runtime"
|
|
|
|
|
"strconv"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type MyWork struct {
|
|
|
|
|
Name string
|
|
|
|
|
BirthYear int
|
|
|
|
|
WP *WorkPool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (mw *MyWork) DoWork(workRoutine int) {
|
|
|
|
|
fmt.Printf("%s : %d\n", mw.Name, mw.BirthYear)
|
|
|
|
|
fmt.Printf("Q:%d R:%d\n", mw.WP.QueuedWork(), mw.WP.ActiveRoutines())
|
|
|
|
|
|
|
|
|
|
// Simulate some delay
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
2018-03-01 09:05:15 +03:00
|
|
|
|
// we create a thread pool where the number of routines to use is based on the number of cores we have on the machine.
|
|
|
|
|
// This means we have a routine for each core. You can’t do any more work if each core is busy.
|
|
|
|
|
// Again, performance testing will determine what this number should be. The second parameter is the size of the queue.
|
|
|
|
|
// In this case I have made the queue large enough to handle all the requests coming in.
|
2018-02-15 09:21:37 +03:00
|
|
|
|
workPool := New(runtime.NumCPU(), 800)
|
|
|
|
|
|
|
|
|
|
shutdown := false // Race Condition, Sorry
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
for i := 0; i < 1000; i++ {
|
|
|
|
|
work := MyWork{
|
|
|
|
|
Name: "A" + strconv.Itoa(i),
|
|
|
|
|
BirthYear: i,
|
|
|
|
|
WP: workPool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := workPool.PostWork("routine", &work); err != nil {
|
|
|
|
|
fmt.Printf("ERROR: %s\n", err)
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if shutdown == true {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
fmt.Println("Hit any key to exit")
|
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
|
reader.ReadString('\n')
|
|
|
|
|
|
|
|
|
|
shutdown = true
|
|
|
|
|
|
|
|
|
|
fmt.Println("Shutting Down")
|
|
|
|
|
workPool.Shutdown("routine")
|
|
|
|
|
}
|