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

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

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

Вот мой код:

$output = array();

for ($i = 0; $i < 4; $i++) {
$pid = pcntl_fork();
$start = ($i == 0) ? 1 : (1000000 * $i) + 1;
$end = 1000000 * ($i + 1);

if (!$pid) {
for ($run = $start; $run <= $end; $run++) {
$output[$i][] = 'Run ' . $run;
}

exit($i);
}
}

while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
}

echo implode("\n", $output);

Просто чтобы уточнить, что я ожидаю, $output массив должен содержать четыре элемента, которые также являются массивами по миллиону элементов в каждом. Это должно выглядеть так:

Array
(
[0] => Array
(
[0] => Run 1
[1] => Run 2
[2] => Run 3
...
)

[1] => Array
(
[0] => Run 1000001
[1] => Run 1000002
[2] => Run 1000003
...
)

[2] => Array
(
[0] => Run 2000001
[1] => Run 2000002
[2] => Run 2000003
...
)

[3] => Array
(
[0] => Run 3000001
[1] => Run 3000002
[2] => Run 3000003
...
)

)

1

Решение

Php fork (как fork в NIX) — это всего лишь полная копия процесса и ее env. Родительский процесс не известен изменений у детей. И дети не могут передать результаты родителю. Родитель может проверять только завершение дочерних процессов. Если вы хотите передать данные, вы можете использовать общую память. Но внимание! Разделяемая память в php это не реальная (ОС) разделяемая память. Но для PHP это работает.

Вы можете найти решения здесь: https://github.com/search?q=php+fork

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]