Pull to refresh

Comments 26

А меня удручает, что пытаются найти всякие пути решения задач на PHP, для которых он не предназначен
Есть такая штука — требования заказчика. И вот иногда они не совпадают с представлениями исполнителя о том насколько предоставленные ресурсы предназначены или не предназначены.
Вообще само это решение было придумано лет 10 назад для одного из проектов на С.
И все там было предназначено. Кроме железа которое не успевало выполнить задачу в требуемые сроки с использованием предназначенных механизмов.
И что бы решить ту задачу и был придуман такой механизм.
В том что множество задач выполняются одновременно.
К тому примеру что вы написали, лучше всего подходит библиотека libevent
Может быть. Но у нее есть одно очень существенное ограничение. Это расширение. И его нужно установить. А это не всегда возможно. Т.е. это решение для частного случая когда такая возможность есть. А что делать когда такой возможности нет?
Чтож увас за заказчик такой? Он хочет запустить на шаред хостинге за 2 бакса космический корабль? И что это за задача(или железо), позвольте узнать.
Хотя конечно сдуру можно и хуйэлоу уорлд написать так, чтоб суперкомпьютер считал два дня.
очень часто жадность предела не имеет и как-то так и хотят, печально конечно еще и то, что многие вместо того что космический корабль за две недели не построить и с коленки не запустить беруться. Ну а на шаред хостинге оно не будет работать банально из-за органичений по времени выполнения сркипта, потребляемой памяти и т.п., но осоздание того что надо было делать таки по-нормальному по законам жанра должно придти когда будет уже вбухано много денег, времени, нервов, написано куча костылей, нагерерировано данных и пр.
Про время скрипта это понятно, а причем тут потребляемая память? Ведь это один скрипт, а создание новой задачи это просто добавление элемента в массив.
только как пример, не влезение в лимит памяти — очень частая проблема с шаред хостингами, есть еще много других конечно:)
В задаче для которой это было придумано заказчик уже закупил железо по смешным ценам. Только оно было настолько тормозное что обрабатывать события стандартными средствами не успевало.
Но, вообще, это не имеет отношения к сути вопроса.
Еще как имеет. Если обобщить, то суть вопроса выглядит так:
— Нарисуй мне картину, красивую.
— Но на вашей машине только 32 мегабайта памяти! Да и планшет не подключается, нет USB порта.
— Я все понимаю, но у меня есть MS Paint, я сам видел на ютубе как чуваки в нем мышкой мону лизу рисовали.
— Я конечно могу попробовать, но это будет очень долго и дорого
— Нет ты знаешь, денег у меня особо нету, да и сделать надо было уже вчера.

<следующая фраза диалога за вами>
К вопросу о реализации на PHP — заказчиком был я сам. Для себя.
Я решил что мне нужен простой и удобный механизм для описания задач, их запуска и контроля.
И я его реализовал. Хотя первые версии были очень неудобные для практического применения.
Примерно как в примере. Когда появилась довольно удобная версия я стал её использовать.
Но это статья о самом принципе. Какой смысл обсуждать личные свойства заказчиков?
Вот именно.

По сути описан слегка завуалированный event loop с callback-ами, вызывающимися на каждом «шаге».
Не совсем правильно называть это многозадачностью в классическом понимании.

> Задача это алгоритм обрабатывающий СОБЫТИЯ
Как раз отсюда и следует, что нам нужно обрабатывать много событий псевдопараллельно — значит, нам нужен цикл обработки событий.

Кстати, есть небольшая проблема в описанном подходе. Поскольку время у вас дискретно с шагом 10мс, то порядок обработки пришедших событий определяется исключительно порядком запуска задач, а не порядком возникновения событиый — то есть если одно событие произошло раньше другого, то совсем не следует, что оно будет обработано раньше.
Это верно. По сути это и есть цикл обработки событий. А в качестве обработчика и выступает та или иная задача. Только это ведь не настоящая асинхронная обработка событий.
Это просто быстрая обработка событий. Очень быстрая для PHP.
Если 10мс кажется много по требованиям задачи, то можно и убрать эту задержку, тогда цикл будет от силы сотни микросекунд (при разумном количестве задач). Только процессор будет сильно загружен.
Поздравляю, вы только что сделали свою первую(?) операционную систему с кооперативной многозадачностью с помощью инструментов, которые для этого совершенно не предназначены. Этому концепту уже далеко не десять лет, он применялся в таких замечательных ОС как Windows до 95 а так же в мириадах встроенных систем.

Беда в том, что это не настоящая многозадачность. Это ее костыльная реализация на платформе, которая сама по себе является многозадачной и должна освобождать от необходимости городить костыли. Циферками тут похрустеть не получится — для PHP, для ОС это все равно один поток исполнения. Жонглировать данными — да, разумеется, только следите за глобальными переменными, чтобы не вышло как с Therac-25, ну и используйте асинхронные вызовы, потому что синхронные вызовы будут ломать всю вашу многозадачность тем, что они просто не будут отдавать контроль.

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

(и запускайте то, что пишете — у вас в коде «swith», а не «switch».)
Это вовсе не беда что это не настоящая многозадачность. Это простой и удобный способ обойти некоторые ограничения существующие в языке. Это просто механизм, который может быть очень полезен для решения определенных задач. Вот и все. У кого есть такие задачи могут им воспользоваться. Или воспользоваться любым другим удобным им методом.
несколько лет получал настоящую многозадачность (ну или на 99% как у взрослых) с форком процессов и обменом данными с помощью PCNTL и обертки из ZendX для нее. Из недостатков: юникс онли и некоторое время на спавн нового процесса, но многопоточность и изящность это дело более-менее компенсировала.

глобалы, процедурный стиль и лисапеды — дорога в ад
>глобалы, процедурный стиль и лисапеды — дорога в ад
Точно. Но это же просто демонстрация механизма, а вовсе не готовое решение.
У любого решения есть свои плюсы и минусы.
А чем это отличается от

<?php

function a($a) { static $inner = null; if(null===$inner) $inner = $a; echo $inner++; }

register_tick_function(«a», 1);
declare(ticks=1);
while(true) { echo «d»; sleep(1); }

?>
?
По-моему, тоже. Тут можно спокойно работать с любой очередью событий, не останавливая выполнение основной ветки программы. И это не изобретение велосипеда, а общеизвестная возможность.
Во первых, у меня нет основной ветки если не считать бесконечного цикла с poll — там всё является задачами. Во вторых в твоем примере нет никаких задач как задач, это просто дерганье какой то функции в произвольные и совершенно не контролируемые моменты времени.
Большая часть программистов заявляют что многозадачности в PHP нет
А где эта большая часть это заявила? Как собрана статистика?
Чего только люди не делают, лишь бы только не уходить с работы, где ставят такие идиотские задачи, и не перейти работать на том же erlang'е (да даже на python'е с gevent'ом и т.п.)
Sign up to leave a comment.

Articles