Как реализовать на php диспетчер php-процессов (IPC на php под Windows)?

Boriso

Новичок
Как реализовать на php диспетчер php-процессов (IPC на php под Windows)?

Добрый день!
Часто использую php для решения не-Web задач, например, конвертации локальных файлов, различный анализ и т.п. Для этих целей стоит Денвер (Apache + PHP + MySQL) под Windows. Скрипты запускаю через открытие окна в браузере или из командной строки. Основной недостаток - сложно отслеживать процесс и управлять, если одновременно запускаю несколько задач. Поэтому хочу создать диспетчера на php, который будет управлять скриптами (процессами).

Приведу описание в терминах строительства:
а) Участвуют: заказчик (пользователь), прораб (диспетчер), рабочие (скрипты).
б) Заказчик находит прораба (может быть только один) и формулирует ему задания.
в) Прораб находит (или использует имеющихся) рабочих, каждому из которых формулирует его ближайшую задачу.
г) Каждый рабочий, получив задание от прораба, берёт нужные инструменты и начинает работать.
д) На различных этапах рабочие могут сообщить прорабу о своём прогрессе по выполнению задач или неудаче, причём они всегда знают, где найти прораба. Иногда прораб может быть занят общением с другими участниками, поэтому надо подождать.
е) Если необходимо, то прораб может сам пойти искать рабочих - посмотреть, работают ли они. Прогресс не важен, главное, чтобы никто не "сбежал".
ж) Заказчик может спросить у прораба, что было сделано и прораб сообщит о известном ему прогрессе (пункт (б) минус пункт (д) и пункт (е)).
з) Заказчик может скорректировать задания (пункт (б)).

Дополнительно:
и) Прораб может добавить рабочих (аналог (в)) или выгнать существующих.
к) У рабочих может появиться специализация, тогда им можно давать лишь определённые задания.


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


Вопросы:
1) Существует ли уже пример подобной реализации централизованного управления?
2) Кроме сокетов какая может быть альтернатива эффективного подключения к классу-диспетчеру и обмена данными под windows?
3) Для сериализации запросов к классу-диспетчеру что можно использовать под windows кроме flock?
4) Есть ли примеры php-классов, реализующих IPC ("Inter-Process Communication" - межпроцессное взаимодействие) под windows?

Заранее благодарен за ответы!
 

korchasa

LIMB infected
Писать супервайзера для консольных скриптов это по-моему перебор. В чем сложность выводить прогресс в консоль?
 

Boriso

Новичок
Автор оригинала: korchasa
Писать супервайзера для консольных скриптов это по-моему перебор. В чем сложность выводить прогресс в консоль?
Сложности выводить прогресс в консоль нет (именно так сейчас и работает), но возникают сложности с общим управлением. Поскольку весь процесс огромен, то он делится на отдельные "простые" задачи - функции, после каждой из которых можно продолжить выполнение (если сохранить минимальный контекст). Сейчас каждый скрипт примерно так и работает: считывает очередное задание из mysql, обрабатывает его, добавляет новые задачи, заносит результат выполнения. Задач очень много, причём некоторые используемые ресурсы нельзя повторно использовать до определённого этапа - есть небольшой график зависимостей. В ходе выполнения иногда обнаруживаю ошибки в результатах, тогда надо повторить с определённого момента.

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

Boriso

Новичок
А какие альтернативы базе данных: файл, память, ...?
Изначально заданий два десятка, но в ходе работы они генерируют ещё сотню тысяч. Каждое из них выполняется от 0.1 до 5 секунд. В случае ошибки надо продолжать, а не начинать сначала, поэтому память не годится. А как в файле отслеживать новое/выполненное - не знаю. Сейчас в базе у меня галочка статус, которая переходит из статуса "новое" в статус "активно", а потом в статус "выполнено".

build-системы - это make-скрипты и ant-подобные?
сразу приходят в голову два "но":
i) не слышал, о динамическом генерировании заданий в ходе выполнения заданий; да и задание последовательности может оказаться не таким уж и тривиальным;
ii) я готов жертвовать потерей производительности php против native C(++) за счёт простоты программирования, но не ждать, например, 5 часов вместо 2 из-за накладных расходов на дополнительные инструменты и постоянную инициализацию контекста.


Если посоветуете готовые системы, где диспетчера могу сам запрограммировать, то мне они тоже подойдут.
 

fixxxer

К.О.
Партнер клуба
IPC можно реализовать через сокеты, оно вроде и под виндой работает.

Супервайзор хрен знает, как под виндой сделать, это слишком win api specific, но я бы поискал какую-нить запускалку обычных cli в качестве сервисов. Типа daemontools/runit только для винды. Наверняка есть.
 

korchasa

LIMB infected
А в чем проблема повторить после ошибки? exec + проверка результата. Ну т.е. если есть супервайзер, то и дерево в нем есть. Хотя сотня тысяч это многовато. А их точно столько должно быть? Укрупнить нельзя? И смущает генерация новых заданий в процессе. Почему это отдельные задания? Почему не просто запуск какой-то функции?

Из простого, и что умеет параллельность из коробки - посмотри наш taskman. Из того, что тебе нужно, там нет прогресса(дописать должно быть не сложно) и обновления дерева. Подозреваю, что обновления дерева нет нигде.
 

Boriso

Новичок
fixxxer
С сокетами всегда раздражает написание базовой функциональности по поддержке протокола (запаковка и распаковка конкретных вызовов). Если другого пути не найду, то придётся на сокетах. В любом случае, сокеты позволят сделать приложение распределённым - отправить часть вычислительных процессов на другой компьютер.


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

На taskman посмотрю, хотя меня уже заинтересовал toolkit в качестве универсального обработчика (в зависимости от версии реализации решателя).
 

korchasa

LIMB infected
Мда, интересная задачка. А место с чем сливать как выясняется? Просто с тем же уровнем у соседней ветки? И когда это выясняется? При обработке отдельного узла, или при анализе результатов ветки?
 

Boriso

Новичок
По md5, а уровни могут быть любыми. Выясняется всё при обработке конкретного узла, точнее при добавлении нового задания проверяется его уникальность.
Представьте, что в графических файлах ищем различные шаблоны размера 2 на 2. Пусть будет исходный файл 400 на 400. Из него можно получить один шаблон при размере стороны для него 200, но если будем создавать уже из стороны 100, то их там может быть уже 201*201=40401, что очень много. Поэтому вначале обрабатываем большие куски, например, 8 на 8, а уже потом начинаем их анализировать. Из 8 на 8 есть 49 способов выделить 2 на 2, поэтому такую ветвь гораздо проще проанализировать. А само разделение тоже оценивается по различным эвристическим оценкам и вырубаются слишком похожие или блеклые ветви.


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

phprus

Moderator
Команда форума
Boriso
Может быть стоит посмотреть в сторону специализированных решений для программирования систем с распределенной памятью (например MPI)? Средства для междпроцессного взаимодействия путем передачи сообщений и не только там есть. Правда придется отказаться от PHP.
 

Boriso

Новичок
phprus
Еще нахожусь в фазе активного поиска наиболее эффективного алгоритма, поэтому пока рано переписывать наработки на С.
 
Сверху