Почему не стоит использовать многопоточность в php?


Я знаю, что в php нет потоковой обработки. Но в этом уроке они показывают, что, используя способность хост-операционных систем формировать, мы можем этого достичь. Он также сказал, что этого не следует делать в производственном коде. Почему это плохая идея?

Вот пример кода

$processID = pcntl_fork();
if($processID) {
     echo "I'm in the parent process!";
} else {
     echo "I'm in the child process!";
}

Вот учебник .

Author: eddard.stark, 2014-09-14

3 answers

Создает ли разветвление поток?

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

В чем разница между Раздвоенным процессом и потоком?

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

То, как различные операционные системы на самом деле реализуют потоки и процессы, выходит за рамки этого ответа и не имеет значения.

Почему разветвление - плохая идея на интерфейсе?

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

Почему потоковая передача - плохая идея на интерфейсе?

Если клиентский сценарий инструктирует операционную систему создать 8 потоков в прямом ответе на веб-запрос, и 100 клиентов одновременно запрашивают сценарий, вы будете инструктировать свою операционную систему выполнять 800 потоков одновременно.

Процессоры и операционные системы должны выглядеть совсем по-другому, чтобы это было хорошей идеей!

Где проходит хорошая резьба идея?

Многопоточное программное обеспечение и чрезвычайно мощное аппаратное обеспечение распространены повсеместно; без него вычисления не были бы тем, чем они являются.

В контексте веб-инфраструктуры mysql и другие серверы баз данных являются многопоточными, действительно, Apache может развертывать PHP в многопоточной инфраструктуре, хотя я бы не рекомендовал это.

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

Вот как мы используем потоки на языках, которые их поддерживают; мы разрабатываем системы, средства предоставления услуг которых осуществляются с помощью какой-либо разумной формы IPC, мы полностью изолируем нашу сложную инфраструктуру от того, что должно быть простым: наших веб-приложений.

Действительно ли PHP подходит для потоков?

Модель памяти для PHP не является общей: это означает, что каждый контекст интерпретатора в смысл структур и памяти, необходимых PHP для работы, изолирован от любого другого контекста.

Это всегда должно быть верно, чтобы PHP работал так, как задумано; реализация потоковой обработки для PHP, которая не знала о том, как работает PHP, просто не будет функционировать.

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

Действительно ли потоки подходит для меня?

Во-первых, серьезно подумайте над следующими вопросами:

  • Действительно ли требуется потоковая передача?
  • Какие еще способы вы можете найти для достижения того, что вы намереваетесь сделать?

Многопоточное программное обеспечение является сложным по своей природе; то, что является сложным, на мой взгляд, не является оправданием для того, чтобы избегать его.

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

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

Сложность чего-либо уменьшается по мере увеличения ваших знаний, вот как работает обучение, вот где оно начинается:

Https://gist.github.com/krakjoe/6437782

Это продолжается в руководстве, во многих примерах, распространяемых с помощью pthreads, в поиске и вопросах stackoverflow, и, на мой взгляд, приводит к славе.

 10
Author: Joe Watkins, 2014-09-14 06:52:29

PHP должен работать на веб-сервере, обслуживающем интерфейс. В типичной среде у вас есть несколько пользователей (веб-клиентов), которые параллельно полностью используют ядра вашего процессора. Разделение работы из одного потока на несколько обычно не имеет смысла в такой среде. Поскольку система уже загружена и потоковая передача требует дополнительной работы по синхронизации и т.д. Обычно лучше переложить "сложные" задачи на серверную систему, а затем отчитаться. Благодаря этому серверная система выполняет сложную вещь можно масштабировать независимо. Также задания могут быть поставлены в очередь, чтобы пользователь получал мгновенный отчет ("мы работаем"), а затем получал отчет о выполненных работах.

Использование pcntl_fork() создает копию процесса, это может быть полная копия процесса веб-сервера, который попытается связаться с клиентом через одно и то же сетевое соединение (это тоже копируется), что приведет к полному беспорядку. Это также приведет к путанице с уже существующими подключениями к базе данных и т.д. (по крайней мере, оба процесса постараюсь его закрыть... таким образом, второй получит запутанную ошибку базы данных)

Для фактической потоковой обработки существует расширение pthreads в PECL, которое не создает копию процесса, но использует тот же процесс, который нарушает модель памяти PHP (которая предполагает, что в одном потоке одновременно есть один запрос, который не делится ни с кем другим) некоторые люди используют это, но выгрузка в другие системы обычно лучше

Что часто бывает у людей, так это ИО операции (т.е. вызовы базы данных), которые требуют времени. В этом случае асинхронные операции могут быть выполнены (т.Е. См. mysqli_poll и mysqli_reap_query). Это в основном позволяет вам что-то делать на процессоре, ожидая ввода-вывода и время от времени проверяя ввод-вывод.

 1
Author: johannes, 2014-09-14 00:07:20

Здесь ничего "не достигнуто", pcntl_fork создает новый процесс . Если вы создадите несколько процессов, вы, скорее всего, в какой-то момент столкнетесь с гоночными условиями - PHP не был разработан для параллельного выполнения, у вас будут всевозможные странные ошибки и проблемы с управлением.

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

Вместо этого вы может писать классы, которые вызывают методы друг друга, что позволяет вам решать практически любые проблемы - те, которые не могут быть решены без использования fork, скорее всего, из-за плохого дизайна; веб-сайтам не нужно выполнять длительные задачи, но они могут ставить их в ОЧЕРЕДЬ, добавление crontab-записей было бы одним из примеров.

 0
Author: specializt, 2014-09-13 23:49:01