gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:25:02 29 4
gpt4 key购买 nike

通常在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com