Parallel execution
There are two effects for using parallelism:
parcreates a unit of parallel execution;joincombines an array of units to the array of their results.
par/join is almost identical to defer/wait from Defer, the difference is in the semantics. defer is not supposed to be always awaited, it's usually fired-and-forgotten. On the contrary, par is meant to be joined at some point.
class MakeRequests
include Dry::Effects.Resolve(:make_request)
def call(urls)
# Run every request in parallel and combine their results
urls.map { |url| par { make_request.(url) } }.then { |pars| join(pars) }
end
end
Just as Defer, Parallel uses concurrent-ruby under the hood.