【发布时间】:2016-01-13 22:04:26
【问题描述】:
尝试在项目中使用 OTP-style 并得到一个 OTP-interface 问题。哪种方案更受欢迎/更美观?
我有什么:
- 带有
mochiweb的网络服务器 - 一个进程,产生许多 (1000-2000) 个子进程。 儿童包含状态(netflow-speed)。如果需要,处理给孩子的代理消息并创建新的孩子。
在 mochiweb 中,我有一页显示所有演员的速度,乳清是如何制作的:
nf_collector ! {get_abonents_speed, self()},
receive
{abonents_speed_count, AbonentsCount} ->
ok
end,
%% write http header, chunked
%% and while AbonentsCount != 0, receive speed and write http
这不是选择风格,我怎么能理解。解决方案:
- 在 API 同步函数中获取所有速度的请求并返回所有速度的列表。但我想马上写给客户。
-
API-function 的一个参数是回调:
nf_collector:get_all_speeds(fun (Speed) -> Resp:write_chunk(templater(Speed)) end) - 返回迭代器:
get_all_speeds 的结果之一将与接收块一起使用。每次调用都会返回
{ok, Speed},最后返回{end}。
get_all_speeds() ->
nf_collector ! {get_abonents_speed, self()},
receive
{abonents_speed_count, AbonentsCount} ->
ok
end,
{ok, fun() ->
create_receive_fun(AbonentsCount)
end}.
create_receive_fun(0)->
{end};
create_receive_fun(Count)->
receive
{abonent_speed, Speed} ->
Speed
end,
{ok, Speed, create_receive_fun(Count-1)}.
【问题讨论】:
-
真正的问题是什么?您是否在实施任何选项时遇到困难,如果是,您应该询问与此相关的问题。否则,这将主要是完全取决于您的用例的意见。
-
我同意 Adam 的观点,并且认为这更像是一个设计问题,但没有足够的信息提供任何建议。为什么有 1000-2000 个包含状态的孩子。为什么有进程返回计数并发出调用而不是返回那些孩子并让调用者决定做什么?读/写比率是多少?什么是非功能性需求,比如低延迟或吞吐量更重要?它是主要功能还是占系统其余部分的比例?等等。如果没有其他信息,这对我来说没有多大意义。
-
写这个问题的原因很简单:erlang 提供了编写基于actor的程序的简单方法,OTP 提供了标准化。首先,我编写了没有 OTP 的程序,理解程序逻辑很复杂。添加 OTP 后,它变得平坦而简单。在这里,我遇到了一种更复杂的行为,即同步/异步调用。我问路,如果遇到类似的问题,其他 erlang 开发人员会选择什么。或者这个问题是由糟糕的设计引起的,答案是 - 做简单,没有 1000 个(或更多)演员
-
尝试改写:如果我的电话与许多演员联系在一起,那么我必须处理许多情况:1. 当我的电话接收消息时,一个或多个演员死亡 2. 呼叫发起者死亡 3. 造成 2一次 -3 次以上的呼叫 4. 其他... 哪里有任何 OTP 行为、良好的编码标准或关于我如何做到这一点的建议?其他查看我的代码的 erlang 编码人员的回答并没有开始瞎忙 :) 如果不是,真的,我可以通过多种方式做到这一点,所以......我可以关闭这个问题
标签: erlang erlang-otp gen-server