服务器和状态

作为一个练习来测试我对顺序Erlang的理解,我写了一个简单的html标签编辑器。

它在文本中维护当前位置,例如编辑状态,如下所示:

-record(ed_txt, {a=[], b=[], c=[]).

...当前段落上方保留文本,b保存当前段落,c保存当前段落下方的文本。

它被这样调用:

tag(App, FileName) ->
   {ok, File1} = get_file(App, FileName),
   {ok, File2} = file_to_paragraphs(File1),
   {ok, Record} = create_record(File2),
   ....

tag(Record) ->
   {ok, InputTuple} = get_input(Record), % gets edit command
   ...
   do(Command, Record)

函数do / 2是递归函数,如下所示:

   do("h", Record)    -> tag(help(Record));
   do("down", Record) -> tag(down(Record));
   do("up",Record)    -> tag(up(Record));
   do("h1", Record)   -> tag(wrap("H1", Record));
   ...
   do("quit", Record) -> {ok, quit(Record)};
   do(_, Record)      -> tag(Record).

现在我想将这个模块变成一个OTP代码服务器,但是我意识到我并不真正了解如何维护状态。

我创建了一个状态记录:

-record(state, {app, filename, a=[], b=[], c=[]}).

我的想法是使用一对一的主管,这样每个用户都可以在他/她自己的进程中工作,放弃编辑循环,并使用handle_call(或handle_cast)调用相应的编辑功能。

但是让我困惑的是:

只要进程正在运行,大概用户状态在进程中被维护,但handle_call和handle_cast都将State作为参数并返回State。

这是否意味着我也必须为每个用户维护其各自进程之外的状态,在ets中也许呢?

还是有更好的方法来完成这一切?

非常感谢,

LRP

链接地址: http://www.djcxy.com/p/38251.html

上一篇: server and state

下一篇: Erlang Dynamic supervisor start gen