如何使用子集连接进程

时间:2014-08-30 12:35:01

标签: erlang

我想在子集中存储不同的进程。

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]),

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

除了spawn/4作为节点的第一个参数外,spawn的最后一个参数是函数参数的列表,因此编写spawn(?MODULE,proc,[1,1])将调用{{1它会调用proc/2。你已经定义了proc(1,1),一个没有参数的函数,而在erlang中这些是不同的函数。