【发布时间】:2018-03-04 14:45:45
【问题描述】:
通过 Joe 的书,卡在第 12 章练习 1。该练习要求编写一个函数 start(AnAtom,Fun),它将 AnAtom 注册为生成(有趣)。我决定尝试一些看似更简单的方法 - 采用本章完成的“area_server”模块,并修改它的 start/0 函数,如下所示:
start() ->
Pid = spawn(ex1, loop, []),
io:format("Spawned ~p~n",[Pid]),
register(area, Pid).
所以代替执行任意 Fun 的进程,我正在注册“循环”,它是 area_server 模块中的一个函数,完成所有工作:
loop() ->
receive
{From, {rectangle, Width, Ht}} ->
io:format("Computing for rectangle...~n"),
From ! {self(), Width*Ht},
loop();
{From, {square, Side}} ->
io:format("Computing for square...~n"),
From ! {self(), Side*Side},
loop();
{From, Other} ->
io:format("lolwut?~n"),
From ! {self(), {error, Other}},
loop()
end.
它似乎工作得很好:
1> c("ex1.erl").
{ok,ex1}
2> ex1:start().
Spawned <0.68.0>
true
3>
3> area ! {self(), hi}.
lolwut?
{<0.61.0>,hi}
4> flush().
Shell got {<0.68.0>,{error,hi}}
ok
5> area ! {self(), {square, 7}}.
Computing for square...
{<0.61.0>,{square,7}}
6> flush().
Shell got {<0.68.0>,49}
ok
当我尝试测试多个进程是否可以与注册的“服务器”通信时,事情变得很糟糕。 (CTRL-G, s, c 2)
我在一个新的 shell 中,与第一个 shell 一起运行 - 但是当我从这个新 shell 向我的“区域”注册进程发送消息时,会发生一些令人讨厌的事情 - 当查询 process_info(whereis(area)), process从此状态移动:
{current_function,{ex1,loop,0}},
{initial_call,{ex1,loop,0}},
到这个:
{current_function,{io,execute_request,2}},
{initial_call,{ex1,loop,0}},
当消息队列开始增长时,消息没有得到处理。挂在模块io中,呵呵! io操作被阻止了?显然,该过程从我的 ex1:loop/0 移动到 io:execute_request/2 (不管是什么)...是我的愚蠢打印导致问题吗?
【问题讨论】:
-
嗯,我想知道这是否与此处讨论的问题相同:elixirforum.com/t/…
标签: erlang erlang-shell