Skip to content

Instantly share code, notes, and snippets.

@VijitCoder
Last active November 13, 2017 05:25
Show Gist options
  • Save VijitCoder/174ee58641af95846a1f0035fcfd2411 to your computer and use it in GitHub Desktop.
Save VijitCoder/174ee58641af95846a1f0035fcfd2411 to your computer and use it in GitHub Desktop.
Тест для прохождения на хакатон. Томск 2017
<?php
/**
* Требуется написать код, в котором будет функция умножающая 2 на X, где X - номер текущей итерации. Функция выдает
* ответ с задержкой в рандомном интервале от 0 до 1000 миллисекунд.
*
* Код должен запускать эту функцию 10 раз в асинхронном режиме и выводить результат в стандартную консоль, таким
* образом, чтобы ответы шли последовательно.
*
* Решение работает только в Linux. Основано на этом примере http://php.net/manual/ru/function.pcntl-fork.php#110790
*
* Запуск: php async.php
*/
$children = [];
for ($i = 0; $i < 10; ++$i) {
$pid = pcntl_fork();
if ($pid == -1) {
die('Не удалось породить дочерний процесс');
} else if ($pid) {
$children[$pid] = null;
} else {
exit(multiplier($i));
}
}
while (($childPID = pcntl_waitpid(0, $status)) != -1) {
$status = pcntl_wexitstatus($status);
$children[$childPID] = $status;
// Чтобы увидеть реальную очередь выполнения:
// echo "Дочерний процесс #$childPID отработал: $status\n"; // DBG
}
foreach($children as $pid => $value) {
echo $value . PHP_EOL;
}
/**
* Подождать от 0 до 1000 миллисекунд, потом вернуть удвоенное значение параметра
* @param int $x
* @return int
*/
function multiplier(int $x): int
{
$ms = rand(0, 1000) * 1000;
usleep($ms);
return $x * 2;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment