【问题标题】:Erlang process gets stuckErlang进程卡住了
【发布时间】:2014-01-17 13:22:36
【问题描述】:

我是第一次使用 erlang。每次我尝试运行 erlang 进程时,它都会卡住并且不接受输入。我在eclipse中使用erlide插件来测试erlang代码。

代码是::

-module(message_router).

%% ====================================================================
%% API functions
%% ====================================================================
%%-compile(export_all).
-export([start/0]).
-export([stop/1]).
-export([send_chat_message/3]).
-export([route_messages/0]).



%% ====================================================================
%% Internal functions
%% ====================================================================
start() ->
    spawn(message_router, route_messages, []).

stop(RouterPid) ->
    RouterPid ! shutdown.

send_chat_message(RouterPid, Addressee, MessageBody) ->
    io:format("send_chat_msg FROM:: ~p TO:: ~p ~n", [RouterPid, Addressee]),
    RouterPid ! {send_chat_msg, Addressee, MessageBody}.

route_messages() ->

receive
    {send_chat_msg, Addressee, MessageBody} ->
        io:format("recv_chat_msg PID:: ~p ~n", [Addressee]),
        Addressee ! {recv_chat_msg, MessageBody},
        route_messages();

    {recv_chat_msg, MessageBody} ->
        io:format("Received: ~p~n", [MessageBody]);

    shutdown ->
        io:format("Shutting down ~n");

    Oops ->
        io:format("Warning! Received: ~p~n", [Oops]),
        route_messages()
end.

当我点击时,尝试像在 shell 中一样运行代码

Eshell V5.10.4
(nodename@pa)1> P1 = message_router:start().
<0.1308.0>
(nodename@pa)2> P2 = message_router:start().
<0.1373.0>
(nodename@pa)3> chat_client:send_message(P1, P2, "FIRST Msg").
Sending chat message from chat_client
send_chat_msg FROM:: <0.1308.0> TO:: <0.1373.0> 

在此之后我在 shell 中输入的所有内容都会生效。任何人都可以解释如何在 erlang 和最佳实践中处理循环。

[编辑]

聊天客户端代码:

-module(chat_client).
-export([send_message/3]).
send_message(RouterPid, Addressee, MessageBody) ->
    io:format("Sending chat message from chat_client~n"),
    message_router:send_chat_message(RouterPid, Addressee, MessageBody).

【问题讨论】:

  • 尝试拨打message_router:send_message(P1, P2, "FIRST Msg").
  • 您查看过 gen_servers 吗?像这样的例子是很好的做法,会让你的工作更轻松erlang.org/doc/man/gen_server.html | learnyousomeerlang.com/clients-and-servers
  • 能否显示chat_client:send_message 代码?
  • 如果您之前没有 Erlang 经验,甚至没有函数式编程,请考虑阅读一些内容以加快速度。如果书籍是个问题,有像这样的很棒的在线指南:learnyousomeerlang.com/content
  • Odobenus Rosmarus 这里是来自 chat_client -module(chat_client) 的代码。 -出口([send_message/3])。 send_message(RouterPid, Addressee, MessageBody) -> io:format("从chat_client发送聊天消息~n"), message_router:send_chat_message(RouterPid, Addressee, MessageBody)。

标签: eclipse erlang erlide


【解决方案1】:

模块中的问题。打电话给message_router:send_chat_message(P1, P2, "FIRST Msg")
看这个例子和他的比较:

让模块调用observer它注册两个进程loop/0trans/0

-module(observer).
-export([observer/0, loop/0, trans/0]).

observer() ->
  register(loop, spawn(fun observer:loop/0)),
  register(trans, spawn(fun observer:trans/0)).

loop() ->
  receive
    {'PRINT', Msg} -> 
      io:format("print from ~p~n~p~n", [self(), Msg]), loop();
    {'EXIT', _FromPid} -> 
      io:format("Exit ~nFrom ~p", [_FromPid]), exit(self(), kill)
  end.

trans() ->
  receive
    {Command, Msg} -> io:format("transports from: ~p~n~p~n", [self(), Msg]),
                      loop ! {Command, Msg}
  end.

并且有模块send_messenger一个函数send_message通过trans发送消息:

-module(send_messenger).
-export([send_message/1]).

send_message({Command, Msg}) ->
  trans ! {Command, Msg},
  ok.

希望对你有所帮助!

【讨论】:

  • 我厌倦了你建议的命令。我仍然卡住了。我无法理解 route_message() 它是如何循环的。
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多