Skip to main content

parallel_processing_pipeline

⚡ Parallel Processing Pipeline

For CPU‑intensive pipelines (e.g., resizing multiple large images), you can fork subprocesses or use concurrent threads to fully utilize multi‑core systems. Ensure each subprocess initializes its own ImageMagick context to avoid thread‑safety issues.

require "concurrent"
require "image_processing/mini_magick"

images = Dir["uploads/*.jpg"]

# Use Concurrent::Promises for a forking pool
futures = images.map do |path|
Concurrent::Promises.future_on(Concurrent::FixedThreadPool.new(4)) do
ImageProcessing::MiniMagick
.source(path)
.resize_to_limit(2000, 2000)
.strip
.quality(85)
.call(destination: "processed/#{File.basename(path)}")
end
end

# Wait for all tasks to finish
Concurrent::Promises.zip(*futures).value!
puts "All images processed in parallel"