Как отправить сообщение для получения в 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.