Обычно вы не ожидаете прямого ответа при отправке приведения, иначе вы бы использовали gen_server:call.
Пример из реальной жизни: у меня есть gen_server, который обрабатывает некоторые «каналы», и есть много способов добавить имя канала в журнал ошибок. Имя канала хранится в состоянии gen_server. Чтобы не задерживать процесс, который хочет зарегистрировать ошибку, я не использую синхронный вызов «получить имя», чтобы получить имя перед добавлением, а отправляю сообщения с приведениями:
error(Pid, Tags) ->
gen_server:cast(Pid, {log, error_report, Tags}).
warning(Pid, Tags) ->
gen_server:cast(Pid, {log, warning_report, Tags}).
info(Pid, Tags) ->
gen_server:cast(Pid, {log, info_report, Tags}).
Приведение обрабатывается довольно простым обработчиком, который не возвращает значение.
handle_cast({log, Report, Tags}, #state{name=Name}=State) ->
error_logger:Report([{chan, Name} | Tags]),
{noreply, State};
Если у вас есть асинхронные сообщения для отправки обратно, это совершенно не зависит от обработки приведения. Вам как-то нужно знать, куда отправлять эти сообщения, которые вы должны каким-то образом хранить в State
, или вы используете фиксированное имя.
Обычно вы не должны просто отправлять сообщение, а скорее вызывать функцию принимающего модуля процесса (что может быть просто отправкой другого приведения или простого сообщения).
person
Peer Stritzinger
schedule
14.06.2011
cast
иcall
: -асинхронный - person Stratus3D   schedule 27.06.2014