【发布时间】:2013-12-18 20:21:27
【问题描述】:
我目前的目标是编写计算 N 个元素列表的 Erlang 代码,其中每个元素都是其“索引”的阶乘(因此,对于 N = 10,我想得到 [1!, 2!, 3!,...,10!])。更重要的是,我希望每个元素都在一个单独的过程中计算(我知道它效率很低,但我希望稍后实现它并与其他方法比较它的效率)。
在我的代码中,我想使用一个函数作为给定 N 的“循环”,对于 N、N-1、N-2... 生成一个计算阶乘(N)并将结果发送到一些“收集”功能,它将接收到的结果打包到一个列表中。我知道我的概念可能过于复杂,所以希望代码能解释得更多:
messageFactorial(N, listPID) ->
listPID ! factorial(N). %% send calculated factorial to "collector".
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nProcessesFactorialList(-1) ->
ok;
nProcessesFactorialList(N) ->
spawn(pFactorial, messageFactorial, [N, listPID]), %%for each N spawn...
nProcessesFactorialList(N-1).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
listPrepare(List) -> %% "collector", for the last factorial returns
receive %% a list of factorials (1! = 1).
1 -> List;
X ->
listPrepare([X | List])
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
startProcessesFactorialList(N) ->
register(listPID, spawn(pFactorial, listPrepare, [[]])),
nProcessesFactorialList(N).
我想它会起作用,我的意思是 listPrepare 最终返回一个阶乘列表。但问题是,我不知道如何获取该列表,如何获取它返回的内容?至于现在我的代码返回正常,因为这是 nProcessesFactorialList 在完成时返回的内容。我考虑过最终将 listPrepare 中的结果列表发送到 nProcessesFactorialList,但它也需要是一个注册进程,我不知道如何从中恢复该列表。
所以基本上,如何从运行 listPrepare 的注册进程(这是我的阶乘列表)中获取结果?如果我的代码根本不正确,我会寻求如何改进它的建议。提前致谢。
【问题讨论】:
标签: list concurrency parallel-processing functional-programming erlang