В брокере кроме PUB/SUB реализована возможность делать REQUEST-RESPONSE.
По факту это тот же PUB/SUB только вместе с сообщением поставляется обратный адрес, и получивший предполагает, что может на этот обратный адрес ответ написать.
Если я реализую метод
sub()
и буду хранить функции в массиве, то когда я запущу блокирующую прослушку придется написать такой код:
function sub($subscriptionId, $topic, $fnListener) {
$this->subscriptions[ $subscriptionId ] = $fnListener;
$this->sendMessage(new Sub($topic));
}
function process($message) {
$subscriptionId = $message->subscription_id;
if ($fnListener = $this->subscriptions[ $subscriptionId ]) {
$result = call_user_func($fnListener, $message); // вот в этом месте вызов блокирующий, если вызвать в цикле это приостановит цикл пока обработчик не выполнится, что может занять час например.
}
if ($replyTo = $message->get('reply-to')) {
$this->sendMessage(new Pub($replyTo, $result));
}
}
Меня интересует - как более правильно предусмотреть интерфейс позволяющий указать обработчик, который позже будет запущен параллельно? Это может быть как pcntl_fork(), так и proc_open(), так и \React\async($function) - не суть, в итоге все равно будет цикл, который проверяет готовность всех запущенных в каждом шаге.
* Если я правильно понимаю, то любая параллель это два действия: "стартануть" и "проверить готовность" (если готово, то resolve() или если нет - то reject() - т.е. есть вроде еще 2 действия (итого 4) - если все ок или если все не ок).
Требовать передавать \Generator - неплохо конечно, но оно же от софта зависит, кому-то удобно блокирующим способом делать, кому-то генератором-корутиной, а кому-то возвращать промиз реактовый, кто-то хотел бы использовать имя консольной команды, в общем - хочется какого-то единого варианта, но ничего в башку не приходит. Интерфейс ParallelHandler что-ли сделать и к нему приводить?