diff --git a/lib/sprockets/manifest.rb b/lib/sprockets/manifest.rb index f7738e3ca..8c00ffb55 100644 --- a/lib/sprockets/manifest.rb +++ b/lib/sprockets/manifest.rb @@ -77,6 +77,7 @@ def initialize(*args) end @data = data + @executor = Concurrent::FixedThreadPool.new([8, Concurrent.processor_count].min) end # Returns String path to manifest.json file. @@ -115,6 +116,8 @@ def files @data['files'] ||= {} end + attr_accessor :executor + # Public: Find all assets matching pattern set in environment. # # Returns Enumerator of Assets. @@ -131,17 +134,16 @@ def find(*args) environment = self.environment.cached promises = paths.map do |path| - Concurrent::Promise.execute do + Concurrent::Promise.execute(executor: executor) do environment.find_all_linked_assets(path) do |asset| yield asset end end end - promises.each(&:wait!) if filters.any? - promises = environment.logical_paths.map do |logical_path, filename| - Concurrent::Promise.execute do + promises += environment.logical_paths.map do |logical_path, filename| + Concurrent::Promise.execute(executor: executor) do if filters.any? { |f| f.call(logical_path, filename) } environment.find_all_linked_assets(filename) do |asset| yield asset @@ -149,9 +151,9 @@ def find(*args) end end end - promises.each(&:wait!) end + Concurrent::Promise.zip(*promises).wait! nil end