Ich portierte die meisten meiner App auf OTP-Verhalten, aber ich stecke fest. Ich kann nicht herausfinden, wie man mit einem gen_server selektiv empfängt. Wenn keine der Callback-Funktionsklauseln mit einer Nachricht übereinstimmt, wird die Nachricht nicht zurück in das Postfach geschrieben, sondern es wird ausgegeben.Wie erhalten Sie selektives Empfangen in gen_servers?
Jetzt, überall, wo ich gehe, Leute lauschen selektiv empfängt. Überall, wo ich hingehe, loben die Leute OTP. Kann es wirklich wahr sein, dass du beides nicht gleichzeitig haben kannst? Scheint das nicht wie ein großer, korrigierbarer Mangel?
Wie gehen Erlang Programmierer damit um?
EDIT (Reaktion auf zed Kommentar):
ein Beispiel Hier ist, wo Ich mag würde eine Liste von ganzen Zahlen in sortierter Reihenfolge gedruckt, um zu sehen:
-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}.
Natürlich in meiner realen Anwendung, es gibt Timer-Verzögerungen und die Nachrichten, die in der Reihenfolge verarbeitet werden müssen, werden mit anderen Nachrichten verschachtelt. Insbesondere sende ich HTTP-Anfragen ab, manchmal auf einmal, manchmal einzeln nacheinander mit einem Intervall dazwischen. In jedem Fall muss ich sie in der Reihenfolge sammeln.
Was möchten Sie erreichen? – Zed