Parallel Requests

Some adapters support running requests in parallel. This can be achieved using the in_parallel method on the connection object.

# Install the Typhoeus adapter with `gem install faraday-typhoeus` first.
require 'faraday/typhoeus'

conn = Faraday.new('http://httpbingo.org') do |faraday|
  faraday.adapter :typhoeus
end

now = Time.now

conn.in_parallel do
  conn.get('/delay/3')
  conn.get('/delay/3')
end

# This should take about 3 seconds, not 6.
puts "Time taken: #{Time.now - now}"

A note on Async

You might have heard about Async and its native integration with Ruby 3.0. The good news is that you can already use Async with Faraday (thanks to the async-http-faraday gem) and this does not require the use of in_parallel to run parallel requests. Instead, you only need to wrap your Faraday code into an Async block:

# Install the Async adapter with `gem install async-http-faraday` first.
require 'async/http/faraday'

conn = Faraday.new('http://httpbingo.org') do |faraday|
  faraday.adapter :async_http
end

now = Time.now

# NOTE: This is not limited to a single connection anymore!
# You can run parallel requests spanning multiple connections.
Async do
  Async { conn.get('/delay/3') }
  Async { conn.get('/delay/3') }
end

# This should take about 3 seconds, not 6.
puts "Time taken: #{Time.now - now}"

The big advantage of using Async is that you can now run parallel requests spanning multiple connections, whereas the in_parallel method only works for requests that are made through the same connection.