gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

Как лучше реализовать возможность передать \Closure, чтобы запустить его не-блокирующим способом?

В брокере кроме 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 что-ли сделать и к нему приводить?
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
gzhegow
@gzhegow Автор вопроса
aka "ОбнимиБизнесмена"
Раз нет ответа отвечу сам. Видимо промиз. Он как раз и есть мост между параллелью и синхроном. И коль скоро деферед дает отложенный запуск и позволяет проверять состояние то пожалуй он лучше еще. Пора уже пср щикам написать интерфейс на дефер и промиз
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы