... > Ruby > Асинхронные запросы в...

Асинхронные запросы в Ruby

НАВИГАЦИЯ ПО СТРАНИЦЕ

Установка библиотеки async Асинхронные Запросы Обработка Ошибок

Асинхронные запросы позволяют эффективно обрабатывать множество задач без блокировки основного потока выполнения. В 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-запросы, без блокировки основного потока выполнения. Это особенно полезно в сценариях, где требуется параллельное выполнение задач.