Erlang备忘:parallel map

本文介绍了Erlang中两种并行映射实现方法:一种是基于Master-Worker模式的pmap函数,另一种是利用列表推导式实现的parmap函数。这两种方法都能有效地将任务分配到多个工作进程中,并收集结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[url]http://www.pkblogs.com/montsamu/2007/02/erlang-parallel-map-and-parallel.html[/url]

Joe Armstrong 提出了一个pmap实现

[code]pmap(F, L) ->
S = self(),
Pids = map(fun(I) ->
spawn(fun() -> do_f(S, F, I) end)
end, L),
gather(Pids).

gather([H|T]) ->
receive
{H, Ret} -> [Ret|gather(T)]
end;
gather([]) ->
[].

do_f(Parent, F, I) ->
Parent ! {self(), (catch F(I))}.[/code]

嗯,相当不错,Master-Worker模式。

有人在回复那里提供了一个List Comprehensions方案

[code]parmap(F, L) ->
Parent = self(),
[receive {Pid, Result} -> Result end || Pid <- [spawn(fun() -> Parent ! {self(), F(X)} end) || X <- L]].[/code]

第一个列表
[spawn(fun() -> Parent ! {self(), F(X)} end) || X <- L]
生成了一系列worker进程,计算F(X)

第二个列表
[receive {Pid, Result} -> Result end || Pid <- ...]
收集计算结果,然后返回一个结果列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值