Я тестирую код из Руководство пользователя по началу работы с Erlang Параллельное программирование Раздел.
В tut17.erl
я запустил процесс с erl -sname ping
и еще один процесс с al -sname pong
, как описано в руководстве.
-module(tut17).
-export([start_ping/1, start_pong/0, ping/2, pong/0]).
ping(0, Pong_Node) ->
{pong, Pong_Node} ! finished,
io:format("ping finished~n", []);
ping(N, Pong_Node) ->
{pong, Pong_Node} ! {ping, self()},
receive
pong ->
io:format("Ping received pong~n", [])
end,
ping(N - 1, Pong_Node).
pong() ->
receive
finished -> io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
pong()
end.
start_pong() ->
register(pong, spawn(tut17, pong, [])).
start_ping(Pong_Node) ->
spawn(tut17, ping, [3, Pong_Node]).
Из процесса пинга и понга я мог вызвать start_ping и start_pong, чтобы убедиться, что все работает нормально.
(ping@smcho)1> tut17:start_ping(pong@smcho).
<0.40.0>
Ping received pong
Ping received pong
Ping received pong
ping finished
(pong@smcho)2> tut17:start_pong().
true
Pong received ping
Pong received ping
Pong received ping
Pong finished
Я пытаюсь запустить тот же код из командной строки; Для простого примера hello world:
-module(helloworld).
-export([start/0]).
start() ->
io:fwrite("Hello, world!\n").
Я использую следующую командную строку:
erlc helloworld.erl
erl -noshell -s helloworld start -s init stop
Итак, я просто попробовал следующее, но в итоге произошел сбой.
- От узла ping:
erl -noshell -sname ping -s tut17 start_ping pong@smcho -s init stop
- От узла понг:
erl -noshell -sname pong -s tut17 start_pong -s init stop
Однако я получил этот отчет об ошибке от ping
, когда pong
заканчивается, ничего не печатая.
=ERROR REPORT==== 6-Mar-2015::20:29:24 ===
Error in process <0.35.0> on node 'ping@smcho' with exit value:
{badarg,[{tut17,ping,2,[{file,"tut17.erl"},{line,9}]}]}
По сравнению с подходом REPL, с командной строкой, каждый процесс не ждет ответа от партнера, а останавливается через некоторое время. Что может быть не так?