首页 > 解决方案 > 我的消息传递示例有什么问题?

问题描述

我正在尝试从一个进程发送一条消息,该消息是我生成的另一个进程进行分配,我觉得我在这里非常接近,但我认为我的语法有点偏离:

-module(assignment6).
-export([start/1, process1/2, process2/0, send_message/2]).

process1(N, Pid) ->

    Message = "This is the original Message",

    if 
        N == 1 ->
            timer:sleep(3000),
            send_message(Pid, Message);

        N > 1 ->
            timer:sleep(3000),
            send_message(Pid, Message),
            process1(N-1, Pid);

        true ->
            io:fwrite("Negative/0, Int/Floating-Point Numbers not allowed")
    end.

process2() ->
    recieve
        Message ->
            io:fwrite(Message),
            io:fwrite("~n");
    end.

send_message(Pid, Message) ->
    Pid ! {Message}.

start(N) ->
    Pid = spawn(assignment6, process2, []),
    spawn(assignment6, process1, [N, Pid]).

该程序的目标是消息,将在函数启动时打印 N 次,但要延迟足够多,以便我可以在运行中热交换消息的措辞。我只是无法将消息process2打印出来。

标签: recursionerlangmessage-passingerlang-shellhotswap

解决方案


四件小事:

  • 是拼写receive,不是recieve
  • 删除 中的分号process2。表达式中的最后一个子句receive没有终止分号。if您可以在表达式中看到这一点process1:前两个子句以分号结尾,但第三个子句没有。
  • process2中,打印如下消息:

    io:fwrite("~p~n", [Message])
    

    由于Message是元组,而不是字符串,因此将其作为第一个参数传递给io:fwrite会导致badarg错误。让我们要求io:fwrite为我们格式化它。

  • process2打印消息后可能应该调用自己。否则,它将收到一条消息然后退出。

所以现在你可以运行代码了,当它运行时你可以加载一个带有不同消息的新版本的模块(所谓的“热代码交换”)。这会改变正在打印的消息吗?为什么/为什么不?

它不会。 process1对自身进行本地调用,这意味着它保留在旧版本的模块中。改为进行外部调用(明确指定模块:)assignment6:process1(N-1, Pid),它将切换到新版本。


推荐阅读