Dunaevlad
@Dunaevlad

Как сделать многопоточные запросы используя Thread Pooling?

Есть пример кода:

POOL_SIZE = 10

jobs = Queue.new

10_0000.times{|i| jobs.push i}

workers = (POOL_SIZE).times.map do
  Thread.new do
    begin      
      while x = jobs.pop(true)
        puts "job"
      end
    rescue ThreadError
    end
  end
end
workers.map(&:join)


Пытаюсь написать, что-то наподобие, только для запросов

POOL_SIZE = 10

jobs = Queue.new

tasks = ['www.example.com', 'www.example.com', 'www.example.com'].each{ |url| jobs.push(url)}

workers = (POOL_SIZE).times.map do
  Thread.new do
    begin      
      response = tasks.each{|uri| HTTParty.get(uri)}
      p response
    rescue ThreadError
    end
  end
end

workers.map(&:join)
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
В главном потоке добавляются задачи в очередь, а в потоках воркеров они должны потребляться из неё.

вместо
response = tasks.each{|uri| HTTParty.get(uri)}
должно быть что-то типа
while url = jobs.pop(true)
  response = HTTParty.get(url)
  # обработка response
end


Дополнительные примеры:
https://gist.github.com/romiras/70cd02ff186ad64f57...
https://gist.github.com/romiras/3a4705dc61260a46f7...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы