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

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


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

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

最佳答案

如果您想让一个进程向另一个进程发送消息,很明显您需要两个进程。当 Yaws 收到 HTTP 请求时,默认情况下它会将请求分派(dispatch)到其 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 文件很方便,但它们可能会受到限制。另一种方法是构建一个包含 Yaws 和您自己的应用程序的 Erlang 系统,并使用 Yaws appmod feature 让 Yaws 将请求分派(dispatch)到您自己的运行您自己的 Erlang 模块的进程中。在这里解释所有内容并不实用,因此请咨询 Yaws documentationYaws book ,或向 Yaws mailing list 寻求帮助。

关于concurrency - 如何发送消息以在 YAWS/Erlang 中接收,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37635491/

10-11 15:12