【发布时间】:2010-11-20 09:33:06
【问题描述】:
我将我的大部分应用程序移植到 OTP 行为,但我被卡住了。我不知道如何使用 gen_server 进行选择性接收。如果没有任何回调函数子句匹配一条消息,而不是将消息放回邮箱,它会出错!
现在,无论我走到哪里,人们都称赞选择性接收。无论我走到哪里,人们都会称赞 OTP。不能同时拥有两者真的是真的吗?这似乎不是一个可以纠正的主要缺点吗?
erlang 程序员如何处理这个问题?
编辑(回应zed的评论):
这是一个示例,我希望看到按排序顺序打印的整数列表:
-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}.
当然,在我的真实应用程序中,存在计时器延迟,并且需要按顺序处理的消息与其他消息交错。特别是,我发送 http 请求,有时一次发送多个请求,有时一次发送一个请求,它们之间有间隔。无论如何,我需要按顺序收集它们。
【问题讨论】:
-
你想达到什么目标?
标签: erlang