Запуск сообщения об обновлении в функции горячей перезагрузки кода Erlang - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь использовать функцию горячего кода erlang, следуя инструкциям из LYAE , но я не понимаю, как сделать сообщение update для запуска.

У меня есть модулькоторый запускает метод, который можно обновить:

Модуль

-module(upgrade).
-export([main/1,upgrade/1,init/1,init_link/1]).
-record(state,{ version=0,comments=""}).


init(State)->
    spawn(?MODULE,main,[State]).
main(State)->
    receive 
        update->
            NewState=?MODULE:upgrade(State),
            if NewState#state.version>3 -> exit("Max Version Reached") end,

            ?MODULE:main(NewState);
        SomeMessage->
            main(State)
    end.



upgrade(State=#state{version=Version,comments=Comments})->
    Comm=case Version rem 2 of
            0 -> "Even version";
            _ -> "Uneven version"
         end,
    #state{version=Version+1,comments=Comm}.

Оболочка

>c(upgrade).
>rr(upgrade,state).
>U=upgrade:init(#state{version=0,comments="initial"}).
>Monitor=monitor(process,U).
> ......to something to trigger the update message
> flush().  % see the exit message reason

Я не понимаюКак я могу выполнить горячую перезагрузку кода, чтобы вызвать сообщение update. Я хочу, чтобы при использовании flush получить причину выхода из моего main метода.

1 Ответ

3 голосов
/ 11 октября 2019

Процесс ожидает получить атом update в качестве сообщения. Поскольку у вас есть pid процесса в переменной U, вы можете отправить сообщение следующим образом:

U ! update.

Обратите внимание, что строки Even version и Uneven version хранятся только в состоянии,никогда не печатается, так что вы не увидите их. Единственное, что вы увидите, это сообщение о выходе, после отправки update четыре раза и вызова flush().

...