Concurrency 如何在YAWS/Erlang中发送要接收的消息
在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->
代码>符号在并发编程中发送消息以接收,但在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模块的进程中。在这里解释这些是不实际的,因此请咨询或,或向寻求帮助。去天堂,谢谢!