Аарон Паттерсон (@tenderlove) использует пример, почти такой же, как ваш, чтобы описать, почему вы можете и должны использовать потоки для достижения параллелизма в вашей ситуации.
Большинство библиотек ввода-вывода теперь достаточно умны, чтобы освободить GVL (глобальную блокировку виртуальной машины, или большинство людей знают ее как GIL или глобальную блокировку интерпретатора) при выполнении ввода-вывода. Для этого в С есть простой вызов функции. Вам не нужно беспокоиться о коде C, но для вас это означает, что большинство библиотек ввода-вывода, достойных их внимания, собираются выпустить GVL и позволить другим потокам выполняться, пока поток, выполняющий ввод-вывод, ожидает возвращения данных. .
Если то, что я только что сказал, сбивает с толку, вам не нужно слишком беспокоиться об этом. Главное, что вам нужно знать, это то, что если вы используете приличную библиотеку для выполнения ваших HTTP-запросов (или любой другой операции ввода-вывода в этом отношении ... базы данных, межпроцессного взаимодействия и т. Д.), Интерпретатор Ruby (MRI) достаточно умен, чтобы иметь возможность снять блокировку на интерпретаторе и позволить другим потокам выполняться, пока один поток ожидает ввода-вывода. Если следующий поток имеет свой собственный ввод-вывод для захвата, интерпретатор Ruby сделает то же самое (если предположить, что библиотека ввода-вывода построена для использования этой возможности Ruby, что, как я полагаю, в настоящее время используется чаще всего).
Итак, чтобы подвести итог тому, что я говорю, используйте темы! Вы должны увидеть выигрыш в производительности. Если нет, проверьте, использует ли ваша библиотека http функцию rb_thread_blocking_region () в C, и, если нет, выясните, почему нет. Возможно, есть веская причина, может быть, вам стоит подумать об использовании лучшей библиотеки.
Ссылка на видео Аарона Паттерсона находится здесь: http://www.youtube.com/watch?v=kufXhNkm5WU
Стоит посмотреть, хотя бы ради смеха, так как Аарон Паттерсон - один из самых смешных людей в Интернете.