From 3f9f09880c3dc560686749401fcab073979e9af8 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Sun, 3 Nov 2019 19:21:18 +1300 Subject: [PATCH 1/3] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9438983..f355c45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [dev] +## [0.1.0] - Switch to go mods - go (>= 1.11 required) - Switch to axllent/semver for app updating From 521f3f24c1f070f9dc79ab8c1b2a6de84a29aa54 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Fri, 13 Dec 2019 22:21:00 +1300 Subject: [PATCH 2/3] Add threaded option --- CHANGELOG.md | 5 +++++ README.md | 1 + main.go | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f355c45..2e79a04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [dev] + +- Add threaded option (`-t`) to use all CPU cores + + ## [0.1.0] - Switch to go mods - go (>= 1.11 required) diff --git a/README.md b/README.md index 9b8f044..b162f5a 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Options: -m, --max string downscale to a maximum width & height in pixels (x) -o, --out string output directory (default overwrites original) -p, --preserve preserve file modification times (default true) + -t, --threaded run multi-threaded (use all CPU cores) -u, --update update to latest release -v, --version show version number -h, --help show help diff --git a/main.go b/main.go index a67d2bd..b906011 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,9 @@ import ( "os" "os/exec" "regexp" + "runtime" "strconv" + "sync" "github.com/axllent/ghru" "github.com/spf13/pflag" @@ -22,6 +24,7 @@ var ( optipng string pngquant string gifsicle string + threads = 1 version = "dev" ) @@ -51,13 +54,14 @@ func main() { } var maxSizes string - var update, showversion, showhelp bool + var multiThreaded, update, showversion, showhelp bool flag.IntVarP(&quality, "quality", "q", 75, "quality, JPEG only") flag.StringVarP(&maxSizes, "max", "m", "", "downscale to a maximum width & height in pixels (x)") flag.StringVarP(&outputDir, "out", "o", "", "output directory (default overwrites original)") flag.BoolVarP(&preserveModTimes, "preserve", "p", true, "preserve file modification times") 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(&showhelp, "help", "h", false, "show help") @@ -137,9 +141,34 @@ func main() { } } - for _, img := range args { - Goptimize(img) + if multiThreaded { + 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 From adac20101d1a5bc08adad46187da4daf1f2d4237 Mon Sep 17 00:00:00 2001 From: Ralph Slooten Date: Fri, 13 Dec 2019 23:12:57 +1300 Subject: [PATCH 3/3] 0.2.0 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e79a04..b8af0f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [dev] +## [0.2.0] - Add threaded option (`-t`) to use all CPU cores