Пример передачи сообщений Erlang - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь отправить сообщение от одного процесса, который я породил другому для назначения, я чувствую, что я здесь очень близок, но я думаю, что мой синтаксис немного отклонен:

-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 для распечатки.

1 Ответ

0 голосов
/ 11 декабря 2018

Четыре мелочи:

  • Это пишется receive, а не recieve
  • Снимите точку с запятой в process2.Последнее предложение в выражении receive не имеет завершающей точки с запятой.Это можно увидеть в выражении if в process1: первые два предложения заканчиваются точкой с запятой, а третье - нет.
  • В process2 напечатайте сообщение следующим образом:

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

    Поскольку Message является кортежем, а не строкой, передача его в качестве первого аргумента io:fwrite вызывает ошибку badarg.Давайте попросим io:fwrite отформатировать его для нас.

  • process2, вероятно, должны вызвать себя после печати сообщения.В противном случае он получит одно сообщение и затем выйдет.

Так что теперь вы можете запустить код, и пока он работает, вы можете загрузить новую версию модуля с другим сообщением (такназывается "горячая замена кода").Это изменит сообщение, которое будет напечатано?Почему / почему нет?

...