Есть ли ограничение на количество потоков, которые Ruby может запускать за один раз?

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

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

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

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

12
задан Nakilon 25 November 2012 в 11:57
поделиться

2 ответа

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

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

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

3
ответ дан 2 December 2019 в 18:51
поделиться

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

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

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

3
ответ дан 2 December 2019 в 18:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: