如何发送消息以在 YAWS/Erlang 内接收

How to send message to receive in YAWS/Erlang

通常在 Erlang 中,程序员使用 ! 符号来发送消息以在并发编程中接收消息,但我们如何在 yaws 中做到这一点?假设我正在尝试这样做>

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


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

这个程序一直在等待消息,我该如何给它发送消息?

如果您想让一个进程向另一个进程发送消息,显然您需要两个进程。当 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 放在消息中以标识它来自预期的进程。另请注意,我们 link 到子进程并陷阱退出,以便如果子进程意外死亡,我们可以捕获 EXIT 并正确报告错误。

但这可能不是一个好方法。如果逻辑过程应该 运行 独立于任何 HTTP 请求,你可以在你的 Erlang 系统启动时启动它们的池,并让 out/1 函数发送一个消息来要求它执行请求代表它。这完全取决于这些进程在做什么,它们与传入请求的关系,以及它们的池是否足以满足您期望的请求负载。

使用 .yaws 文件对某些应用程序很方便,但它们可能会受到限制。另一种方法是构建一个包含 Yaws 和您自己的应用程序的 Erlang 系统,并使用 Yaws appmod feature to have Yaws dispatch requests into your own processes running your own Erlang modules. Explaining all that here isn't practical, so please consult the Yaws documentation or the Yaws book, or ask for help from the Yaws mailing list.