Есть много вещей не так с этим кодом. Здесь идет ...
Причина, по которой вызывается функция start_link
, заключается в том, что она запускает процесс и связывает с ним . Ваша stop
функция должна быть вызвана stop
.
Документация для gen_server:call/2,3
показывает две проблемы с этим кодом:
- Вам не нужна форма
{local, Name}
с gen_server:call
. Это нужно только при вызове gen_server:start_link
(и только тогда, когда вы хотите зарегистрированное имя для вашего процесса). Для вызова локальных имен просто используйте Name
. Или идентификатор процесса.
- Не существует варианта функции с арностью 4 (т.е. 4 параметра). 3-арный вариант занимает тайм-аут. Возможно, вам нужен 2-арный.
Я подозреваю , что вы пытаетесь указать произвольную функцию в gen_server:call
(т.е. вы хотите вызвать функцию terminate
). Это не так.
gen_server:call(NameOrPid, Request)
приводит к вызову handle_call(Request, From, State)
. См. документацию .
В этой функции вы можете сопоставить запрос и сделать соответствующую вещь. Примерно так:
handle_call(frob, _From, State) ->
% do whatever 'frob' means.
{reply, ok, NewState};
(что ;
может быть .
, в зависимости от того, является ли это последнее предложение handle_call
).
Если вы действительно хотите, чтобы сервер остановился, вам нужно просто сделать следующее:
handle_call(terminate, _From, State) ->
{stop, meh, State}.
Это приведет к вызову terminate
.
О, и если вы только изучаете Erlang, вы, вероятно, не хотите запускать диализатор, пока не получите немного больше опыта. Это немного ... сложно ... для непосвященных. Хотя он нашел эту ошибку, и это было здорово.