Add threaded option

This commit is contained in:
Ralph Slooten 2019-12-13 22:21:00 +13:00
parent 3f9f09880c
commit 521f3f24c1
3 changed files with 38 additions and 3 deletions

View File

@ -1,5 +1,10 @@
# Changelog # Changelog
## [dev]
- Add threaded option (`-t`) to use all CPU cores
## [0.1.0] ## [0.1.0]
- Switch to go mods - go (>= 1.11 required) - Switch to go mods - go (>= 1.11 required)

View File

@ -35,6 +35,7 @@ Options:
-m, --max string downscale to a maximum width & height in pixels (<width>x<height>) -m, --max string downscale to a maximum width & height in pixels (<width>x<height>)
-o, --out string output directory (default overwrites original) -o, --out string output directory (default overwrites original)
-p, --preserve preserve file modification times (default true) -p, --preserve preserve file modification times (default true)
-t, --threaded run multi-threaded (use all CPU cores)
-u, --update update to latest release -u, --update update to latest release
-v, --version show version number -v, --version show version number
-h, --help show help -h, --help show help

35
main.go
View File

@ -5,7 +5,9 @@ import (
"os" "os"
"os/exec" "os/exec"
"regexp" "regexp"
"runtime"
"strconv" "strconv"
"sync"
"github.com/axllent/ghru" "github.com/axllent/ghru"
"github.com/spf13/pflag" "github.com/spf13/pflag"
@ -22,6 +24,7 @@ var (
optipng string optipng string
pngquant string pngquant string
gifsicle string gifsicle string
threads = 1
version = "dev" version = "dev"
) )
@ -51,13 +54,14 @@ func main() {
} }
var maxSizes string var maxSizes string
var update, showversion, showhelp bool var multiThreaded, update, showversion, showhelp bool
flag.IntVarP(&quality, "quality", "q", 75, "quality, JPEG only") flag.IntVarP(&quality, "quality", "q", 75, "quality, JPEG only")
flag.StringVarP(&maxSizes, "max", "m", "", "downscale to a maximum width & height in pixels (<width>x<height>)") flag.StringVarP(&maxSizes, "max", "m", "", "downscale to a maximum width & height in pixels (<width>x<height>)")
flag.StringVarP(&outputDir, "out", "o", "", "output directory (default overwrites original)") flag.StringVarP(&outputDir, "out", "o", "", "output directory (default overwrites original)")
flag.BoolVarP(&preserveModTimes, "preserve", "p", true, "preserve file modification times") flag.BoolVarP(&preserveModTimes, "preserve", "p", true, "preserve file modification times")
flag.BoolVarP(&update, "update", "u", false, "update to latest release") flag.BoolVarP(&update, "update", "u", false, "update to latest release")
flag.BoolVarP(&multiThreaded, "threaded", "t", false, "run multi-threaded (use all CPU cores)")
flag.BoolVarP(&showversion, "version", "v", false, "show version number") flag.BoolVarP(&showversion, "version", "v", false, "show version number")
flag.BoolVarP(&showhelp, "help", "h", false, "show help") flag.BoolVarP(&showhelp, "help", "h", false, "show help")
@ -137,9 +141,34 @@ func main() {
} }
} }
for _, img := range args { if multiThreaded {
Goptimize(img) threads = runtime.NumCPU()
} }
processChan := make(chan string)
wg := &sync.WaitGroup{} // Signal to main goroutine that worker goroutines are working/done working
wg.Add(threads)
for i := 0; i < threads; i++ {
go func() {
for nextFile := range processChan {
Goptimize(nextFile)
}
// Channel was closed, so we finished this goroutine.
wg.Done() // Let main goroutine know we are done.
}()
}
for _, img := range args {
processChan <- img
}
// Close the channel. This tells the worker goroutines that they can be done.
close(processChan)
// Wait for all worker goroutines to finish processing the IPs
wg.Wait()
} }
// displayDelectedOptimizer prints whether the optimizer was found // displayDelectedOptimizer prints whether the optimizer was found