Erlang 中的并发
Posted
技术标签:
【中文标题】Erlang 中的并发【英文标题】:Concurrency in Erlang 【发布时间】:2021-05-22 16:12:21 【问题描述】:我要解决的问题如下:
编写一个不带参数的名为 squared 的 Erlang 函数。这个函数应该等待接收消息。消息将采用 Pid, N 格式,您可以假设 Pid 是进程 ID,N 是数字。该函数应以 Me, X 的形式向进程 ID Pid 发送消息,其中 Me 是运行该函数的进程的进程 ID,X 是 N 平方的值。然后函数应该结束。
到目前为止我有这个:
-module(main).
-export([squared/0]).
squared() ->
receive
Pid,N -> Pid ! Me, X, squared();
terminate -> ok
end.
我得到的错误如下:
3> c(主)。
main.erl:7: 变量“我”未绑定
main.erl:7: 变量“X”未绑定
main.erl:7:警告:变量“N”未使用 错误
我在问题的第二部分也遇到了麻烦,它要求我们以 Me, X 的形式向进程 ID 发送消息。其中 Me 是进程 ID,X 是 N 平方的值。我们将如何做到这一点?
【问题讨论】:
在您对问题的描述中,函数squared/0
应在回复消息后立即结束。因此,您不需要terminate -> ok
,并且由于您的函数不是递归的,因此该进程将在发送答案后立即终止。未绑定意味着当您尝试使用该变量时没有获得值。有关正确的代码,请参阅 @choroba 的答案。
【参考方案1】:
为了实现你的功能,你可以写一个像下面这样的函数
-module(main).
-export([squared/0]).
squared() ->
receive
Pid,N ->
Pid ! self(), N*N,
squared();
terminate ->
ok
end.
【讨论】:
【参考方案2】:Me
应该是接收进程的pid,即self()
。 N 的平方就是 N*N。
-module(main).
-export([squared/0]).
squared() ->
receive
Pid, N ->
Pid ! self(), N*N;
terminate -> ok
end.
或者,如果你想更冗长:
squared() ->
Me = self(),
receive
Pid, N ->
X = N * N,
Pid ! Me, X;
terminate -> ok
end.
【讨论】:
以上是关于Erlang 中的并发的主要内容,如果未能解决你的问题,请参考以下文章