Есть образец, который я видел иногда, когда функция init/1
процесса gen_server
отправляет сообщение самому себе, сигнализируя, что оно должно быть инициализировано. Цель этого заключается в том, чтобы процесс gen_server
инициализировал себя асинхронно, так что процесс, порождающий его, не должен ждать. Вот пример:
-module(test).
-compile(export_all).
init([]) ->
gen_server:cast(self(), init),
{ok, {}}.
handle_cast(init, {}) ->
io:format("initializing~n"),
{noreply, lists:sum(lists:seq(1,10000000))};
handle_cast(m, X) when is_integer(X) ->
io:format("got m. X: ~p~n", [X]),
{noreply, X}.
b() ->
receive P -> {} end,
gen_server:cast(P, m),
b().
test() ->
B = spawn(fun test:b/0),
{ok, A} = gen_server:start_link(test,[],[]),
B ! A.
Процесс предполагает, что сообщение init
будет получено до любого другого сообщения, иначе оно будет аварийно завершено. Возможно ли, чтобы этот процесс получил сообщение m
перед сообщением init
?
Предположим, что нет процесса отправки сообщений в случайные pids, сгенерированные с помощью list_to_pid
, так как любое приложение, выполняющее это, вероятно, вообще не работает, независимо от ответа на этот вопрос.