2014-08-30 57 views
0

我想在子集中存储不同的进程。如何连接子集的进程

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?
line 36 = P1 = spawn(S1,?MODULE,proc,[1,1]),

回答

0

spawn/4的第一个参数是节点名称。节点不是一组进程。另外,Erlang变量是不可变的。调用spawn不能修改空列表。要存储进程pid,您必须通过追加新元素来创建新列表。

+0

okey,我可以写这样的东西,连接P1与子集S1? 'P1 = spawn(?MODULE,proc,[]),... S1 = [P1,P2,P3],... P1! {[1,1],setGroup,S1}。 (),N,self(),S]);} proc() - > receive {N,setGroup,S} - > io:format(“〜p - 〜p - 〜p〜n” _ - > io:format(“failed〜n”)end.' – Sam 2014-08-30 13:05:34

+0

是的,但请注意'N'会得到值[1,1]'。 – rvirding 2014-08-30 14:22:23

0

除了第一个参数spawn/4是一个节点产卵的最后一个参数是函数的自变量一个列表,所以写spawn(?MODULE,proc,[1,1])将调用proc/2,它将使通话proc(1,1)。你已经定义了proc/0,一个没有参数的函数,在erlang中这些是不同的函数。