есть ли ограничение на количество потоков, которые может запустить ruby ​​одновременно? - PullRequest
11 голосов
/ 22 августа 2010

Если нет, то какой максимум, оставаясь при этом эффективным?

Я создаю 14 потоков, каждый из которых открывает список URL-адресов (около 500), создает новый поток для каждого, который затем загружает его и добавляет в базу данных MySQL.Размер пула MySQL установлен на 50.

Это задача с граблями в RoR.

Будет ли это работать лучше, если использовать Kernal#fork или какой-либо другой метод?

Ответы [ 3 ]

12 голосов
/ 26 января 2014
require 'open-uri'
a = 'http://www.example.com ' * 30
arr = a.split(' ')

arr.each_slice(3) do |group|
  group.map do |site|
    Thread.new do
      open(site)
      p 'finished'
    end
  end.each(&:join)
end
3 голосов
/ 23 августа 2010

Что ж, поскольку ваши потоки будут связаны с вводом-выводом, хорошая новость заключается в том, что для этого подойдут как потоки Ruby 1.8, так и 1.9.В Ruby 1.8 используются «потоки пользовательского пространства», то есть при создании новых потоков в Ruby новые потоки ОС не создаются.Это плохо для многозадачности ЦП, так как на самом деле одновременно работает только один поток Ruby, но хорошо для многозадачности ввода-вывода.Ruby 1.9 использует настоящие потоки и подойдет для любого из них.

Количество потоков, которые вы можете создать, зависит от вашей системы.Конечно, существуют практические ограничения, но вы, вероятно, не хотите приближаться к ним.Во-первых, если серверы, с которых вы загружаетесь, не очень медленные и ваше соединение не очень быстрое, всего несколько потоков будут насыщать ваше интернет-соединение.Кроме того, если вы захватываете много страниц с одного сервера, то сразу 500 запросов на него из 500 потоков тоже не принесут пользы.

Я бы начал с малого: 10или 20 потоков, работающих одновременно.Увеличьте или уменьшите это в зависимости от нагрузки на сервер, пропускной способности и т. Д. Существует также проблема одновременных подключений к базе данных MySQL.В зависимости от того, как настроены ваши таблицы и насколько они велики, попытка одновременно вставить слишком много данных не будет работать очень хорошо.

3 голосов
/ 22 августа 2010

В Ruby 1.8 он практически ограничен объемом вашей памяти.Вы можете создать десятки тысяч потоков за процесс.Интерпретатор Ruby обрабатывает управление потоками, и создается только один или два собственных потока.Это не настоящая многозадачность, когда процессор переключается между потоками.

Ruby 1.9 использует собственные потоки.Похоже, пределом является то, что разрешено ОС.Только для тестирования, я могу создать более 2000 потоков на моем Mac с Ruby 1.9, прежде чем ОС больше не отключается.

Обратите внимание, что иметь тысячи потоков для процесса не очень хорошая идея.Планирование потоков становится бременем задолго до этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...