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

Concurrency 如何在YAWS/Erlang中发送要接收的消息,concurrency,erlang,yaws,Concurrency,Erlang,Yaws,在Erlang中,程序员通常使用符号在并发编程中发送消息以接收,但在yaws中如何执行?假设我正在尝试这样做> <erl> out(Arg) -> loop("bad"). loop(X)-> receive good -> {html, "Good"}; bad -> {html, "bad"} end. </erl> 输出(Arg)->循环(“坏”)。 循环(X)-> 接收 good->

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

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


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

输出(Arg)->循环(“坏”)。
循环(X)->
接收
good->{html,“good”};
坏->{html,“坏”}
结束。

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

如果要让一个进程向另一个进程发送消息,显然需要两个进程。当Yaws收到HTTP请求时,默认情况下,它将请求分派到其Erlang进程池中的一个进程中。当您使用示例中的
.yaws
文件时,该进程将调用
out/1
函数。但这只是一个过程,所以你需要另一个过程

有许多方法可以启动第二个过程。一种简单的方法是
spawn\u 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>

out(_Arg)->
进程_标志(陷阱_退出,真),
Self=Self(),
Pid=spawn\u link(fun()->my\u business\u logic(Self)end),
回路(Pid)。
循环(Pid)->
接收
{Pid,good}->{html,“good”};
{Pid,bad}->{html,“bad”};
{'EXIT',Pid,Reason}->
[{状态,500},
{html,“内部服务器错误”}]
结束。
我的业务逻辑(家长)->
%%在此处运行逻辑,然后发送消息
父母亲{self(),good}。
请注意,我们将子进程
Pid
放在消息中,以确定它来自预期的进程。还要注意的是,我们链接到子进程和陷阱出口,这样如果子进程意外死亡,我们就可以捕获
出口
,并正确地报告错误

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


使用
.yaws
文件对于某些应用程序来说很方便,但它们可能会受到限制。另一种方法是构建一个包含Yaws和您自己的应用程序的Erlang系统,并使用Yaws将Yaws调度请求发送到您自己运行自己的Erlang模块的进程中。在这里解释这些是不实际的,因此请咨询或,或向寻求帮助。

去天堂,谢谢!