2009-12-09 2 views
3

Я создаю веб-приложение, которое требует потоковой обработки, и я пытаюсь выяснить, какой langauge между PHP и Ruby имеет лучшую функцию потоковой обработки и лучшую производительность.На каком языке лучше использовать Threading? PHP или Ruby

Даже если не встроенный, некоторые легкие работы вокруг или надстройки.

+3

Зачем вам нарезать резьбу для веб-приложения? Вы действительно так много обрабатываете для одного запроса, что для него требуется несколько потоков? Если это так, ваш сервер не будет легко перегружен? – tloach

+0

@tloach Threading не обязательно означает подавляющую обработку. Это просто сокращает время обработки. Время обработки в последовательном режиме может составлять 10 с или 1 с, это не имеет значения. Суть сводится к тому, что это время. Во всяком случае, вы всегда можете просто наброситься на него. –

+1

@ Лукас: кроме того, веб-приложения многопоточны благодаря веб-интерфейсу, каждый запрос обрабатывается в другом процессе. Многопоточность вряд ли даст прирост производительности в системе, где все ядра уже заняты, на самом деле она может снизить производительность, поскольку она вводит дополнительные издержки. – tloach

ответ

2

PHP, как правило, не выполняет резьбу.

9

Я должен был бы сказать Ruby, так как Ruby фактически поддерживает его. PHP не делает.

С помощью PHP вы можете создавать новые процессы (это плохая идея) или писать несколько веб-сервисов и использовать функции curl_multi_ * для выполнения некоторых задач, но потоковая передача не является особенностью PHP.

+0

Так что, в основном, мое веб-приложение должно запускать несколько тысяч запросов за 5 минут в фоновом режиме. Я не могу запустить это из одного потока, потому что один поток будет запускать примерно четверть запросов, которые мне нужны, и период времени не может превышать 5 минут, поэтому требуется потоковая обработка. Как вы думаете? – Aceacer

+0

Почему веб-приложения выполняют фоновую обработку? –

+0

Извиняется за мою терминологию, но в основном мое приложение состоит из интерфейсного и этого фонового процессора. – Aceacer

2

PHP не имеет нитей (хорошо, что ИМО).

Ruby имеет, но в 1.8 он имеет зеленые нити, где в 1.9 он имеет GIL. Что это означает (в случае MRI и YARV - 1,8 и 1,9 основных реализаций Ruby) состоит в том, что 2 потока не могут работать одновременно (в обоих случаях), и вы не можете использовать многоядерные процессоры.

Вы можете использовать процессы на обоих языках для преодоления этих ограничений.

+0

Нельзя сказать, что зеленые потоки не могут использовать многоядерные процессоры. Контрпримеры - это Erlang и MzSheme, среди многих других. Также неверно, что Ruby 1.8 имеет зеленые потоки. В спецификации Ruby нет ничего, что заставило Ruby Implementation использовать зеленые потоки, и действительно, все реализации Ruby 1.8, кроме одного, используют собственные потоки. И это неправда, что Ruby 1.9 имеет GIL. Опять же, в Ruby Spec нет ничего, что заставляет реализации иметь GIL, и большинство из них этого не делают. –

+0

Jörg - правильный! Когда я говорил о Ruby, я обычно имел в виду MRI (JRuby имеет правильную поддержку потоков). –

2

В настоящее время PHP не поддерживает явное использование потоков; ваш PHP-сервер может или не может использовать потоки для обслуживания разных HTTP-запросов (как мне кажется, движок Zend), но нет возможности создавать или координировать потоки через PHP-код.

5

Возможно, это два худших языка для выбора, если вы хотите нарезать резьбу, но если вы действительно хотите один из этих двух, я думаю, Ruby может это сделать. Однако лучше пойти с JRuby. JVM отлично работает с потоками.

(Или пойти с Groovy, которая в основном Java с большим количеством Rubyisms.)

0

Ни может быть хорошим способом, чтобы добиться того, что вы пытаетесь.

Рассматривайте Gearman для асинхронной обработки «заданий». Если вы хотите свободно подключить свой сервис к другим услугам, вам потребуется служба обмена сообщениями, такая как RabbitMQ.

Похоже, Gearman подойдет вашим потребностям.

Смежные вопросы