Я пытаюсь реализовать программу, в которой родительский процесс открывает несколько дочерних процессов (обычно около 40), которые работают параллельно друг другу.
Теперь я хочу, чтобы дочерние процессы могли общаться с родительским процессом для извлечения некоторой информации, которой обладает только родительский процесс.Я планировал использовать очереди сообщений в php , но я столкнулся с некоторыми проблемами.Вот мой основной дизайн:
1) Родительский процесс запускается 2) Родительский процесс открывает несколько дочерних процессов 3) Каждый дочерний процесс отправляет несколько сообщений родительскому процессу.Например, конкретный ребенок может отправить от 20 до 100 сообщений родителю.4) Родитель получает каждое сообщение и отправляет ответное сообщение ребенку, для каждого сообщения, которое получает родитель 5) Ребенок получает ответы от родителя и выполняет какое-то действие
К сожалению, я не былв состоянии заставить это работать.Я пробовал много разных вещей, например, иметь отдельную очередь для каждого дочернего элемента, что дало мне «Предупреждение: msg_get_queue () [function.msg-get-queue]: сбой для ключа. Нет места на устройстве в ...»хотя я удалял очереди после того, как с ними покончил.По сути, система открыла около 10-15 очередей, но после этого она больше не могла обрабатывать очереди и, похоже, начала выдавать эту ошибку.
Я также попытался дать каждому дочернему процессу свой собственный требуемый тип msg (см. Msg_get_queue() функция) при отправке сообщения и каждому родительскому сообщению при отправке ответа присваивается свой уникальный требуемый тип msms, но это тоже не сработало.Либо некоторые из моих сообщений были утеряны, либо я начал получать сообщение об ошибке «msgsnd: Ресурс временно недоступен», когда дети пытались отправить свои сообщения родителю (обратите внимание, что некоторые сообщения от детей все же проходят).
Так, например:
дочерний код:
$child_msg = (object)array('unique_msg_id' => $unique_msg_id);
if (!msg_send ($ipc_msg_queue, $child_msg_id, $child_msg, true, true, $msg_err))
{
echo "Msg not sent because $msg_err\n";
}
$parent_msg_id = $unique_msg_id;
if (msg_receive ($ipc_msg_queue, $parent_msg_id, $msg_type, 16384, $msg, true, 0, $msg_error))
{
echo "Msg from parent with id: $parent_msg_id";
}
родительский код:
while each child process is running:
while (msg_receive ($ipc_msg_queue, $child_msg_id, $msg_type, 16384, $msg, true, 0, $msg_error))
{
echo "Msg from child with id: $child_msg_id";
}
$parent_msg_id = $msg->unique_msg_id;
$parent_msg = 'perform some action';
if (!msg_send ($ipc_msg_queue, $parent_msg_id, $parent_msg, true, true, $msg_err))
{
echo "Msg not sent because $msg_err\n";
}
Я нахожусь на коробке Linux и я посмотрел на /proc / sys / fs / mqueue / msg_max, чтобы увидеть ограничение максимального количества сообщений, разрешенных в очереди, но обнаружил, что этот файл даже не существует.Может ли это быть причиной моих проблем?
Итак, я хочу знать:
Как бы вы решили эту проблему, используя очереди сообщений в php?
ПочемуКак вы думаете, я могу получить ошибки, которые я определил выше?
Заранее спасибо