Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.36 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "flag"
  5. "fmt"
  6. "image/jpeg"
  7. "log"
  8. "os"
  9. "path/filepath"
  10. "sync"
  11. )
  12.  
  13. func main() {
  14.  
  15. nworkers := flag.Int("workers", 4, "number of images to process in parallel")
  16. pattern := flag.String("pattern", "*.jpg", "glob pattern to match image filenames")
  17. flag.Parse()
  18.  
  19. tasks := make(chan string)
  20. out := make(chan string)
  21.  
  22. processImage := func(imgName string) {
  23. imgFile, err := os.Open(imgName)
  24. if err != nil {
  25. log.Printf("Can't open %s: %s", imgName, err)
  26. return
  27. }
  28. defer imgFile.Close()
  29. cfg, err := jpeg.DecodeConfig(imgFile)
  30. if err != nil {
  31. log.Printf("Can't get %s size: %s", imgName, err)
  32. return
  33. }
  34. out <- fmt.Sprintf("%s\t%d\t%d\n", imgName, cfg.Width, cfg.Height)
  35. }
  36.  
  37. // run workers
  38. var workersWG sync.WaitGroup
  39. for i := 0; i < *nworkers; i++ {
  40. workersWG.Add(1)
  41. go func() {
  42. defer workersWG.Done()
  43. for imgName := range tasks {
  44. processImage(imgName)
  45. }
  46. }()
  47. }
  48.  
  49. go func() {
  50. defer close(tasks)
  51. matches, err := filepath.Glob(*pattern)
  52. if err != nil {
  53. log.Printf("Can't get files list: %s", err)
  54. return
  55. }
  56. if matches == nil {
  57. log.Print("No files found.")
  58. return
  59. }
  60. for i := 0; i < len(matches); i++ {
  61. tasks <- matches[i]
  62. }
  63. }()
  64.  
  65. var outWG sync.WaitGroup
  66. outWG.Add(1)
  67. go func() {
  68. defer outWG.Done()
  69. for i := range out {
  70. fmt.Print(i)
  71. }
  72. }()
  73.  
  74. workersWG.Wait()
  75. close(out)
  76.  
  77. outWG.Wait()
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement