call синхронный, а cast - не возвращает ответа, то решил поставить pid отправителя в вызове GenServer.cast/2 и в функции hanlde_cast/2 отправить ответку на этот pid.
Меня сейчас интересует следующее - таким образом я всё будет работать в полном асинхронном режиме?
Ну, если после cast не происходит receive, то всё будет ок Но я бы посоветовал глянуть на новые функции gen_server-а из OTP24
՝receive՝ происходит в том модуле, где произошёл вызов GenServer.cast/2. А без receive вообщем как возможно потом получить ответку - я не в курсе.
Кароче, call это типа cast и сразу же receive. Я это имел в виду
Cast не вешает монитор и не падает с nodedown|noproc.
Да, cast вообще много чего не делает. Я просто принцип описал
Как раз из-за того что cast не вешает монитора, лучше воспользоваться связкой send_request и (wait/receive)_response.
Я это уже посоветовал...
Правильно понимаю, что Elixir пока не поддерживает эти колбэки?
Это не коллбэки, а API клиента, пока в Elixir нет, придется пока вызывать как :gen_server., что не отразится на будущей совместимости
Ну вот, понятно, придётся смотреть Erlang.
Если ответ придет в течении небольшого промежутка, например 5 секунд, то можно использовать handle_call со связкой noreply + reply через время
Круто, спасибо! Я где-то читал, что reply превращает синхронный вызов в асинхронный, а в документации говорится, что when the reply cannot be specified in the return value of handle_call/3., я не понимаю, когда это может понадобится при использовании call.
Ответ в handle_call noreply отвязывает gen_server от немедленного ответа. reply(from, resp) он может ответить спрашивающему потом, когда захочет или вообще это сделает другой процесс, которому он делегирует вызов.
Тогда почему бы не воспользоваться handle_cast?
потому что GenServer.cast не ждет ответа, а GenServer.call ждет
Обсуждают сегодня