Асинхронные запросы в Ruby
НАВИГАЦИЯ ПО СТРАНИЦЕ
Асинхронные запросы позволяют эффективно обрабатывать множество задач без блокировки основного потока выполнения. В Ruby можно использовать библиотеку async для реализации асинхронных запросов с использованием концепций async и await.
Установка библиотеки async
Установите библиотеку async с помощью RubyGems:
gem install async
Пример Асинхронного Запроса
require 'async'
async def make_async_request(url)
response = Async::HTTP.get(url)
# Обработка ответа
puts "Статус кода: #{response.status}"
puts "Тело ответа: #{response.read}"
end
Async do
# Асинхронный вызов функции
await make_async_request('https://example.com')
end
В этом примере функция make_async_request выполняет асинхронный HTTP-запрос с использованием Async::HTTP.get. Основная программа использует Async для запуска асинхронной функции.
Параллельные Асинхронные Запросы
require 'async'
async def make_async_request(url)
response = Async::HTTP.get(url)
puts "Запрос к #{url} завершен"
response.read
end
Async do
# Параллельные асинхронные запросы
responses = await(
make_async_request('https://example.com'),
make_async_request('https://example.org'),
make_async_request('https://example.net')
)
# Обработка ответов
responses.each_with_index do |data, index|
puts "Ответ #{index + 1}: #{data}"
end
end
В этом примере три асинхронных запроса выполняются параллельно, и программа ожидает завершения всех трех запросов с помощью await. Результаты обработаны в последующем блоке.
Обработка Ошибок в Асинхронных Запросах
require 'async'
async def make_async_request(url)
begin
response = Async::HTTP.get(url)
response.read
rescue StandardError => e
puts "Ошибка при запросе #{url}: #{e.message}"
nil
end
end
Async do
responses = await(
make_async_request('https://example.com'),
make_async_request('https://nonexistent-url'),
make_async_request('https://example.net')
)
# Обработка ответов и ошибок
responses.each_with_index do |data, index|
if data.nil?
puts "Запрос #{index + 1} завершился ошибкой."
else
puts "Ответ #{index + 1}: #{data}"
end
end
end
В этом примере добавлен блок rescue, который обрабатывает ошибки при асинхронных запросах. Если запрос завершается ошибкой, программа продолжает выполнение, а результатом для этого запроса будет nil.
Использование асинхронных запросов с концепциями async и await в Ruby позволяет эффективно обрабатывать множество задач, таких как асинхронные HTTP-запросы, без блокировки основного потока выполнения. Это особенно полезно в сценариях, где требуется параллельное выполнение задач.