Страницы

2016-10-03

Многопоточность и многопроцессовость на примере php и perl

Речь пойдёт не о  Java
Так же не будет сказано зачем это надо.
Глупый вопрос зачем это для веб проектов - если слово NIO не о чём не говорит и разницу между процессом и потом не видно то в принципе незачем. (дальше можно не читать)

Все неадекватные фантазирующие о многопотомном php -> сюда!

Многопоточность свойство платформы или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При выполнении некоторых задач такое разделение может достичь более эффективного использования ресурсов вычислительной машины.
Многозадачносьть свойство операционной системы или среды выполнения обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких процессов.

Основные отличия многопоточности и параллельной многозадачности в цене запуска. Ресурс затрачиваемый на запуск процесса (так же называемого воркером) в разы больше ресурса на запуск потока (threads/нить). И это понятно т.к. в одном процессе могут быть запущены несколько потоков.
При этом есть свои нюансы работы с памятью и сборщиками мусора и т.д.

На изучения этого вопроса подтолкнул разговор, в котором один "программист" (два года как то работающий на перле) сказал, что "в Perl многопоточности нет и никогда не было!"
Мне стало интересно сравнить препроцессор html (php) и язык программирования (perl). Сравнивать я буду со своей субъективной стороны -  с серверной части т.к. меня в первую очередь волнует этот момент.
Как то меня смутила фраза отсутствия в perl потоков - потому как при компиляции perl есть флаг "-Dusethreads"
Я не разработчик, и особо не испытываю симпатий к perl. Но результат говорит сам за себя (хотя может на продакшн php себя будет вести по другому?).
Для начала я просто, банально запустил бесконечный цикл на php и на perl
Цикл одинаковый как видно из приведённого кода

Вообще я пытался увидеть один процесс на одном ядре с "трейдовым" скриптом в 600 потоков и обнаружил то что на скрине чисто случайно.
Процесс ловил через (ps)


Запуск происходит в один поток и один процесс
#Perl
for (my $i=0; ; $i++) {
  print "$i\n";
}





#PHP
for($i=0; ; $i++)
{
  echo $i;
}

Очень удивил результат 
  • php заполнил одно ядро в 100% при выполнении скрипта (процесс один)
  • тогда как perl равномерно распределил нагрузку на все ядра (процесс один)

Интересно как себя будет вести приложение на php если сервер имеет 100500 процессоров а код выполняется в один поток и одним процессом?
Так же упрётся в 100% одного ядра (при условии каких то вычислений для одного запроса)?

Дальше было гугление + терзания всех от перлячников до явистов пишущих низкоуровневые APIшки.

Пример запуска 600 потоков на perl (в одном процессе!)

#!/usr/bin/env perl

print "# Test Threads In Perl \n";


use threads;

use threads::shared;

sub thrd($) {

  my $num = shift;
  print "   In-thread :: [$num] \n";
  #threads->exit(0);
  #return 0;
}


for ($n = 0; $n < 600; $n++) {

  print "=== Create thread [$n] ===\n";
  threads->create(\&thrd, ($n));
};

sleep 20;

$_->join for(threads->list());
print "=== End. === \n";

Получилось в рамках одного процесса запущено около 600 потоков
Уверен что 600 процессов(копий) скрипта будут расходовать совсем другое количество ресурсов.

Вот что удалось нагуглить по perl (ссылка одна из первых) Многопоточность в Perl, или Как я посмотрел ролик о съёмках Warehouse 13

На сайте mojolicious про threads

UPD: линк по теме для деревянных по пояс так на всякий случай

morphes: ну просто нет ни в перле, ни в php. ну точнее и там, и там есть
Денис Туляков: только что не было уже есть
morphes: есть конечно
morphes: эмуляция
morphes: то есть нет для меня вообще)
morphes: симулировать тоже самое можно и в PHP - завесить задачу по открытым воркерам
morphes: ядер
morphes: только цель веба не в равномерности, а отдать контент по очереди
Денис Туляков: галыгин vs кличко чёто сразу вспомнил 

morphes: ты можешь просто одну задачу на одном клиенте в таком подходе подвесить весь сервак)

Non-Blocking IO - что это даёт?
Ты можешь отправить другой запрос не ожидая ответа от первого. При этом для каждого запроса, по возможности, будет создан отдельный thread (читай поток), которые могут пере-использоваться другими запросами, в будущем. И никакой там эмуляции нет. Каждый поток, по возможности, бегает на отдельном процессоре (ядре).

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

Отправить комментарий