Как отправить сообщение для получения в YAWS/Erlang

Обычно в Erlang программисты используют ! Символ для отправки сообщения для получения в параллельном программировании, но как мы можем сделать это в рысканиях? Скажи, что я пытаюсь сделать это>

<erl>
out(Arg) -> loop("bad").


loop(X)->
    receive
        good -> {html, "Good"};
        bad  -> {html, "bad"}
    end.
</erl>

Эта программа продолжает ждать сообщения. Как мне отправить ему сообщение?

1 ответ

Решение

Если вы хотите, чтобы один процесс отправлял сообщение другому, ясно, что вам нужны два процесса. Когда Yaws получает HTTP-запрос, по умолчанию он отправляет запрос в один из своих процессов в своем пуле процессов Erlang. Когда вы используете .yaws файл, как в вашем примере, этот процесс вызывает ваш out/1 функция. Но это всего лишь один процесс, поэтому вам нужен другой.

Есть множество способов начать второй процесс. Одним из простых способов является spawn_link процесс для запуска любой логики отправит сообщение loop/1:

<erl>
    out(_Arg) ->
        process_flag(trap_exit, true),
        Self = self(),
        Pid = spawn_link(fun() -> my_business_logic(Self) end),
        loop(Pid).

    loop(Pid) ->
        receive
            {Pid, good} -> {html, "Good"};
            {Pid, bad} -> {html, "Bad"};
            {'EXIT', Pid, Reason} ->
                [{status, 500},
                 {html, "internal server error"}]
        end.

    my_business_logic(Parent) ->
        %% run your logic here, then send a message
        Parent ! {self(), good}.
</erl>

Обратите внимание, что мы помещаем дочерний процесс Pid в сообщении, чтобы определить, что это происходит из ожидаемого процесса. Также обратите внимание, что мы связываемся с дочерним процессом и перехватываем выходы, поэтому, если дочерний процесс неожиданно умирает, мы можем поймать EXIT и сообщить об ошибке правильно.

Но это не может быть хорошим подходом. Если логический процесс должен выполняться независимо от любого HTTP-запроса, вы можете запустить их пул при запуске системы Erlang и получить out/1 Функция отправляет одно сообщение с просьбой выполнить запрос от его имени. Все зависит от того, что делают эти процессы, как они соотносятся с входящими запросами, и достаточно ли наличия их пула для ожидаемой загрузки запросов.

Используя .yaws Файл удобен для некоторых приложений, но они могут быть ограничивающими. Альтернативой является создание системы Erlang, содержащей Yaws и ваше собственное приложение, и использование Yaws. appmod функция отправки запросов Yaws в ваши собственные процессы, выполняющие ваши собственные модули Erlang. Объяснять все это здесь непрактично, поэтому, пожалуйста, ознакомьтесь с документацией Yaws или книгой Yaws или обратитесь за помощью в список рассылки Yaws.

Другие вопросы по тегам