Как сделать веб-сайты Ruby или Python для использования нескольких ядер?

#python #ruby #multithreading #multicore

Вопрос:

Несмотря на то, что Python и Ruby имеют по одному потоку ядра на поток интерпретатора, у них есть глобальная блокировка интерпретатора (GIL), которая используется для защиты потенциально общих структур данных, поэтому это препятствует многопроцессорному выполнению. Несмотря на то, что части этих языков, написанные на C или C , могут быть свободнопоточными, это невозможно с чисто интерпретируемым кодом, если вы не используете несколько процессов. Каков наилучший способ достичь этого? Используете FastCGI? Создание кластера или фермы виртуализированных серверов? Используя их эквиваленты Java, JRuby и Jython?

Ответ №1:

Я не совсем уверен, какую проблему вы хотите таким образом решить, но если вы развернете свое приложение python/django с помощью apache prefork MPM с использованием mod_python, apache запустит несколько рабочих процессов для обработки разных запросов.

Если для одного запроса требуется так много ресурсов, что вы хотите использовать несколько ядер, взгляните на pyprocessing. Но я не думаю, что это было бы разумно.

Ответ №2:

«Стандартный» способ сделать это с rails-запустить «пакет» экземпляров беспородных (т. Е. 4 копии приложения rails), а затем использовать apache или nginx или какое-либо другое программное обеспечение, чтобы сидеть перед ними и действовать в качестве балансировщика нагрузки.

Вероятно, именно так это делается с другими фреймворками ruby, такими как merb и т. Д., Но я лично их не использовал.

ОС позаботится о запуске каждой дворняги на своем собственном процессоре.

Если вы установите mod_rails, он же phusion passenger, он также запустит и остановит несколько копий процесса rails для вас, так что в конечном итоге нагрузка распределится по нескольким процессорам/ядрам аналогичным образом.

Ответ №3:

Используйте интерфейс, который запускает каждый ответ в отдельном интерпретаторе, например, mod_wsgi для Python. Это позволяет использовать многопоточность, не сталкиваясь с GIL.

РЕДАКТИРОВАТЬ: По-видимому, mod_wsgi больше не поддерживает несколько интерпретаторов для каждого процесса, потому что идиоты не могли понять, как правильно реализовать модули расширения. Тем не менее, он по-прежнему поддерживает выполнение запросов в отдельных процессах в стиле FastCGI, так что, по-видимому, это текущее принятое решение.

Ответ №4:

В Python и Ruby можно использовать только несколько ядер, чтобы создавать новые (тяжелые) процессы. Аналоги Java наследуют возможности платформы Java. Вы могли бы подразумевать использование потоков Java. Это, например, причина, по которой иногда (часто) сервер приложений Java, такой как Glassfish, используется для приложений Ruby on Rails.

Комментарии:

1. Нет необходимости создавать новые процессы, просто повторно используйте их между запросами.

2. да, конечно, вы можете повторно использовать процесс для более чем одного запроса, поскольку вы можете использовать пул потоков, чтобы избежать создания потока для каждого запроса. Я имею в виду, что вы должны создать собственный процесс для каждого ядра, который следует использовать.

Ответ №5:

Для Python проект PyProcessing позволяет вам программировать с помощью процессов так же, как вы использовали бы потоки. Он включен в стандартную библиотеку недавно выпущенной версии 2.6 as multiprocessing . Модуль имеет множество функций для установления и управления доступом к общим структурам данных (очередям, каналам и т. Д.) и поддержки общих идиом (т. е. менеджеров и рабочих пулов).