我想在子集中存储不同的进程。
S =子集,P =过程
-module(fibo).
-export([main/0,proc/0]).
main() ->
S1 = [] ,S2 = [], S3 = [],
% init each processes with [1,1] = first and second fibo number
P1 = spawn(S1,?MODULE, proc,[1,1]),
P2 = spawn(S2,?MODULE, proc,[1,1]),
P3 = spawn(S3,?MODULE, proc,[1,1]),
P4 = spawn(S3,?MODULE, proc,[1,1]).
proc() ->
receive
{S,setGroup, N} ->
io:format(" ~p - ~p - ~p~n",[S,self(),N]);
_ ->
io:format(" failed ~n")
end.
但如果我运行main
函数,我会收到此异常/错误:
** exception error: bad argument
in function spawn/4
called as spawn([],fibo,proc,[1,1])
in call from fibo:main/0 (fibo.erl, line 36)
为什么我不能将P1 ... P4连接到S1..S3?
第36行= P1 =产卵(S1,?MODULE,proc,[1,1]),
答案 0 :(得分:0)
spawn / 4的第一个参数是节点名称。节点不是一组进程。另外,在Erlang中,变量是不可变的。调用spawn无法修改空列表。要存储流程pid,您必须通过附加新元素来创建新列表。
答案 1 :(得分:0)
除了spawn/4
作为节点的第一个参数外,spawn的最后一个参数是函数参数的列表,因此编写spawn(?MODULE,proc,[1,1])
将调用{{1它会调用proc/2
。你已经定义了proc(1,1)
,一个没有参数的函数,而在erlang中这些是不同的函数。