improve processing

This commit is contained in:
Celogeek 2022-12-27 13:34:25 +01:00
parent eaba40018a
commit 837a50c950
Signed by: celogeek
GPG Key ID: E6B7BDCFC446233A

View File

@ -47,10 +47,7 @@ type EPub struct {
FirstImageTitle string FirstImageTitle string
Error error Error error
Processors func() ProcessingImages func() chan *ImageDetails
ProcessorsCount int
ProcessorsWG *sync.WaitGroup
ProcessorsResult []chan *ImageDetails
} }
func NewEpub(path string) *EPub { func NewEpub(path string) *EPub {
@ -59,12 +56,6 @@ func NewEpub(path string) *EPub {
panic(err) panic(err)
} }
nbcpu := runtime.NumCPU()
results := make([]chan *ImageDetails, nbcpu)
for r := range results {
results[r] = make(chan *ImageDetails)
}
return &EPub{ return &EPub{
Path: path, Path: path,
@ -76,10 +67,6 @@ func NewEpub(path string) *EPub {
ViewWidth: 0, ViewWidth: 0,
ViewHeight: 0, ViewHeight: 0,
Quality: 75, Quality: 75,
ProcessorsCount: nbcpu,
ProcessorsWG: &sync.WaitGroup{},
ProcessorsResult: results,
} }
} }
@ -170,31 +157,30 @@ func (e *EPub) LoadDir(dirname string) *EPub {
Path string Path string
} }
todo := make([]chan *Todo, e.ProcessorsCount) todo := make(chan *Todo)
for i := range todo {
todo[i] = make(chan *Todo)
}
e.Processors = func() { e.ProcessingImages = func() chan *ImageDetails {
for i := 0; i < e.ProcessorsCount; i++ { wg := &sync.WaitGroup{}
e.ProcessorsWG.Add(1) results := make(chan *ImageDetails)
go func(ticket int) { for i := 0; i < runtime.NumCPU(); i++ {
defer e.ProcessorsWG.Done() wg.Add(1)
defer close(e.ProcessorsResult[ticket]) go func() {
for task := range todo[ticket] { defer wg.Done()
for task := range todo {
data, w, h := imageconverter.Convert(task.Path, true, e.ViewWidth, e.ViewHeight, e.Quality) data, w, h := imageconverter.Convert(task.Path, true, e.ViewWidth, e.ViewHeight, e.Quality)
e.ProcessorsResult[ticket] <- &ImageDetails{task.Images, data, w, h} results <- &ImageDetails{task.Images, data, w, h}
} }
}(i % e.ProcessorsCount) }()
} }
go func() { go func() {
for i, path := range images { for i, path := range images {
todo[i%e.ProcessorsCount] <- &Todo{e.Images[i], path} todo <- &Todo{e.Images[i], path}
}
for i := range todo {
close(todo[i])
} }
close(todo)
wg.Wait()
close(results)
}() }()
return results
} }
e.FirstImageTitle = e.Images[0].Title e.FirstImageTitle = e.Images[0].Title
@ -228,21 +214,16 @@ func (e *EPub) Write() error {
} }
} }
e.Processors() for img := range e.ProcessingImages() {
for i, img := range e.Images {
fmt.Printf("%03d/%03d\n", i+1, len(e.Images))
text := fmt.Sprintf("OEBPS/Text/%s.xhtml", img.Title) text := fmt.Sprintf("OEBPS/Text/%s.xhtml", img.Title)
image := fmt.Sprintf("OEBPS/Images/%s.jpg", img.Title) image := fmt.Sprintf("OEBPS/Images/%s.jpg", img.Title)
details := <-e.ProcessorsResult[i%e.ProcessorsCount] if err := e.WriteFile(wz, text, e.Render(TEMPLATE_TEXT, img)); err != nil {
if err := e.WriteFile(wz, text, e.Render(TEMPLATE_TEXT, details)); err != nil {
return err return err
} }
if err := e.WriteFile(wz, image, details.Data); err != nil { if err := e.WriteFile(wz, image, img.Data); err != nil {
return err return err
} }
} }
e.ProcessorsWG.Wait()
return nil return nil
} }