Transmití la mayor parte de mi aplicación a comportamientos OTP, pero estoy atascado. No puedo entender cómo hacer recepciones selectivas usando gen_server. Si ninguna de las cláusulas de la función de devolución de llamada concuerda con un mensaje, en lugar de volver a colocar el mensaje en el buzón, se produce un error.¿Cómo se hace select select en gen_servers?
Ahora, donde sea que vaya, la gente elogia selectivamente. Donde sea que vaya, la gente alaba a OTP. ¿Puede ser cierto que no puedes tener ambas cosas a la vez? ¿No parece esto una deficiencia importante y corregible?
¿Cómo lo manejan los programadores de erlang?
EDITAR (respondiendo al comentario de la zeta):
He aquí un ejemplo en el que me gustaría ver una lista de números enteros impreso en el orden establecido:
-module(sel_recv).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([test/0]).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
test() ->
gen_server:cast(?MODULE, test).
init([]) ->
{ok, 0}.
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(test, _State) ->
lists:map(fun(N) ->
gen_server:cast(?MODULE, {result, N})
end, [9,8,7,6,5,4,3,2,1]),
{noreply, [1,2,4,5,6,7,8,9]};
handle_cast({result, N}, [N|R]) ->
io:format("result: " ++ integer_to_list(N) ++ "~n"),
{noreply, R}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
Por supuesto, en mi verdadera aplicación, hay retrasos de temporizador y los mensajes que deben procesarse en orden se entrelazan con otros mensajes. En particular, envío solicitudes http, a veces muchas a la vez, a veces una a la vez con un intervalo entre ellas. En cualquier caso, necesito recogerlos en orden.
¿Qué te gustaría lograr? – Zed