Например. предположим, у меня есть модуль, реализующий поведение gen_server, и он имеет
handle_call({foo, Foo}, _From, State) ->
{reply, result(Foo), State}
;
Я могу связаться с этим обработчиком, выполнив gen_server:call(Server, {foo, Foo}) из какого-то другого процесса (думаю, если gen_server попытается выполнить gen_server:call сам, он заблокируется). Но gen_server:call блокируется при ответе (или тайм-ауте). Что делать, если я не хочу блокировать ответ?
Воображаемый вариант использования: Предположим, у меня есть 5 таких gen_servers, и мне достаточно ответа от любых 2 из них. Я хочу сделать что-то вроде этого:
OnResponse -> fun(Response) ->
% blah
end,
lists:foreach(
fun(S) ->
gen_server:async_call(S, {foo, Foo}, OnResponse)
end,
Servers),
Result = wait_for_two_responses(Timeout),
lol_i_dunno()
Я знаю, что gen_server выполнил приведение, но приведение не может предоставить какой-либо ответ, поэтому я не думаю, что это то, что мне нужно в данном случае. Кроме того, похоже, что gen_server не должно беспокоить, хочет ли вызывающий абонент обрабатывать ответ синхронно (используя gen_server:call) или асинхронно (похоже, не существует?).
Кроме того, серверу разрешено предоставлять ответ асинхронно, если handle_call возвращает no_reply, а затем вызывает gen_server:reply. Так почему бы не поддерживать асинхронную обработку ответа на другой стороне? Или это есть, но я просто не могу найти??
handle_cast
? - person CoderDennis   schedule 17.02.2015handle_call
для синхронных методов, аhandle_cast
для асинхронных. Отправка сообщения обратно отправителю — идеальный способ асинхронного выполнения. Не борись с этим. - person CoderDennis   schedule 18.02.2015