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

时间:2016-06-04 22:09:02

标签: concurrency erlang yaws

通常在Erlang程序员中使用!符号来发送消息以在并发编程中接收但是我们如何在雅司中执行此操作?说我正在尝试这样做>

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


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

此程序一直在等待消息,如何向其发送消息?

1 个答案:

答案 0 :(得分:2)

如果您希望让一个进程向另一个进程发送消息,那么很明显您需要两个进程。当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文件对某些应用程序很方便,但它们可能会受到限制。另一种方法是构建一个包含Yaws和您自己的应用程序的Erlang系统,并使用Yaws appmod feature将Yaws调度请求发送到运行您自己的Erlang模块的自己的进程中。解释所有这些不切实际,所以请咨询Yaws documentationYaws book,或向Yaws mailing list寻求帮助。