Erlang:从数据列表传递到进程列表的并行消息

Erlang:从数据列表传递到进程列表的并行消息,erlang,Erlang,如何实现从列表a中的所有值到进程列表B的同时传递?列表A和B的大小相同。假设A=[1,2,3]和B=[,]。我想将值1传递给并行执行中的process等 以下是我到目前为止的想法: pass_values([P|ValueListA], [H|ProcessListB]) -> H ! {foo, P}, pass_values(ValueListA, ProcessListB). 您正在寻找的是一个scatter实用程序,它接受一个元素数组,并将元素分布到一个进程数组中

如何实现从列表a中的所有值到进程列表B的同时传递?列表A和B的大小相同。假设A=[1,2,3]和B=[,]。我想将值1传递给并行执行中的process等

以下是我到目前为止的想法:

pass_values([P|ValueListA], [H|ProcessListB]) ->
    H ! {foo, P},
    pass_values(ValueListA, ProcessListB).

您正在寻找的是一个
scatter
实用程序,它接受一个元素数组,并将元素分布到一个进程数组中

-module(lab).

-compile(export_all).

go() ->
    ProcessList =
        lists:map(fun(_) ->
                          spawn(?MODULE, echo, [])
                  end,
                  lists:seq(1, 6)),
    DataList = ["E", "r", "l", "a", "n", "g"],
    scatter(DataList, ProcessList).

scatter(DataList, ProcessList) ->
    lists:foreach(fun({Data, Process}) ->
                          Process ! Data
                  end,
                  lists:zip(DataList, ProcessList)).

echo() ->
    receive
        Msg ->
            io:format("~p echos ~p~n", [self(), Msg]),
            echo()
    end.
试一试:

1> c(lab).
{ok,lab}
2> lab:go().
<0.40.0> echos "E"
<0.41.0> echos "r"
<0.42.0> echos "l"
<0.43.0> echos "a"
<0.44.0> echos "n"
<0.45.0> echos "g"
ok
1>c(实验室)。
{好的,实验室}
2> lab:go()。
回声“E”
回声“r”
回声“l”
回声“a”
回声“n”
回声“g”
好啊

由于Erlang中的消息传递是异步的,因此在您的情况下可能不需要并行执行。在Erlang中无法并行传递消息。单个进程是一个连续执行的实体。您希望并行传递消息的具体原因是什么?因为您可能希望获得的任何原子性保证在Erlang中都不会成立,但这并没有实现并行消息传递