Render document pages from several goroutines

This commit is contained in:
Milan Nikolic
2026-08-25 12:04:17 +02:00
parent 7cf35d502d
commit 147480003c
+35 -38
View File
@@ -46,23 +46,24 @@ func (c *Converter) convertDocument(ctx context.Context, fileName string) error
for n := 0; n < c.Ncontents; n++ { for n := 0; n < c.Ncontents; n++ {
if ctx.Err() != nil { if ctx.Err() != nil {
return fmt.Errorf("convertDocument: %w", ctx.Err()) break
} }
img, err := c.renderPage(doc, n) eg.Go(func() error {
if err != nil { img, err := c.renderPage(doc, n)
return fmt.Errorf("convertDocument: %w", err) if err != nil {
} return err
}
if img != nil { if img == nil {
eg.Go(func() error { return nil
return c.imageConvert(ctx, img, n, "") }
})
} return c.imageConvert(ctx, img, n, "")
})
} }
err = eg.Wait() if err = eg.Wait(); err != nil {
if err != nil {
return fmt.Errorf("convertDocument: %w", err) return fmt.Errorf("convertDocument: %w", err)
} }
@@ -202,11 +203,7 @@ func (c *Converter) convertDirectory(ctx context.Context, dirPath string) error
eg, ctx := errgroup.WithContext(ctx) eg, ctx := errgroup.WithContext(ctx)
eg.SetLimit(runtime.NumCPU() + 1) eg.SetLimit(runtime.NumCPU() + 1)
for index, img := range contents { convertOne := func(index int, img string) error {
if ctx.Err() != nil {
return fmt.Errorf("convertDirectory: %w", ctx.Err())
}
rel, rerr := filepath.Rel(dirPath, img) rel, rerr := filepath.Rel(dirPath, img)
if rerr != nil { if rerr != nil {
rel = filepath.Base(img) rel = filepath.Base(img)
@@ -216,28 +213,21 @@ func (c *Converter) convertDirectory(ctx context.Context, dirPath string) error
if err != nil { if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
defer file.Close()
if isNonImage(img) && c.prefix == "" && !c.Opts.NoNonImage { if isNonImage(img) && c.prefix == "" && !c.Opts.NoNonImage {
if err = copyFile(file, c.workPath(flatName(rel))); err != nil { if err = copyFile(file, c.workPath(flatName(rel))); err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
if err = file.Close(); err != nil { return nil
return fmt.Errorf("convertDirectory: %w", err)
}
continue
} else if isImage(img) { } else if isImage(img) {
if c.Opts.NoConvert { if c.Opts.NoConvert {
if err = copyFile(file, c.workPath(flatName(rel))); err != nil { if err = copyFile(file, c.workPath(flatName(rel))); err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
if err = file.Close(); err != nil { return nil
return fmt.Errorf("convertDirectory: %w", err)
}
continue
} }
var i image.Image var i image.Image
@@ -251,15 +241,7 @@ func (c *Converter) convertDirectory(ctx context.Context, dirPath string) error
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
if err = file.Close(); err != nil { return nil
return fmt.Errorf("convertDirectory: %w", err)
}
continue
}
if err = file.Close(); err != nil {
return fmt.Errorf("convertDirectory: %w", err)
} }
if i != nil { if i != nil {
@@ -268,11 +250,26 @@ func (c *Converter) convertDirectory(ctx context.Context, dirPath string) error
}) })
} }
} }
return nil
}
for index, img := range contents {
if ctx.Err() != nil {
break
}
if err = convertOne(index, img); err != nil {
break
}
}
if werr := eg.Wait(); werr != nil {
return fmt.Errorf("convertDirectory: %w", werr)
} }
err = eg.Wait()
if err != nil { if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return err
} }
return nil return nil