You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Erlang并行累加器实现问询:关联交换算子并行计算方法

Erlang并行累加器实现方案

嘿,我来给你分享一个完全符合需求的Erlang并行累加器实现——它能接收满足结合律与交换律的算子和值列表,通过并行计算返回最终结果,刚好匹配你给出的示例场景。

核心思路

因为算子满足结合律和交换律,我们可以用分治+并发的思路:把列表拆分成多个子列表,并行计算每个子列表的累加结果,最后用传入的算子合并所有子结果。这种方式能充分利用Erlang的轻量级进程特性,提升处理效率。

完整实现代码

-module(parallel_sum).
-export([sum/2]).

sum(Op, []) -> error(empty_list);
sum(Op, [SingleVal]) -> SingleVal;
sum(Op, List) ->
    % 将列表拆分为大致相等的两部分
    {LeftHalf, RightHalf} = split_list(List),
    % 启动两个并行进程分别计算子列表的累加结果
    LeftWorker = spawn(fun() -> self() ! {result, sum(Op, LeftHalf)} end),
    RightWorker = spawn(fun() -> self() ! {result, sum(Op, RightHalf)} end),
    % 等待两个进程返回结果
    receive {result, LeftResult} -> ok end,
    receive {result, RightResult} -> ok end,
    % 用传入的算子合并最终结果
    Op(LeftResult, RightResult).

% 辅助函数:拆分列表为左右两部分
split_list(List) ->
    ListLen = length(List),
    MidPoint = ListLen div 2,
    {lists:sublist(List, MidPoint), lists:nthtail(MidPoint, List)}.

示例验证

我们用你给出的两个测试用例来验证效果:

示例1:字符串拼接

执行命令:

parallel_sum:sum(fun (A,B) -> A++B end , ["U", "V", "W"]).

输出结果:

"UVW"

示例2:整数求和

执行命令:

parallel_sum:sum(fun(A,B) -> A+B end, [2,6,7,10,12]).

输出结果:

37

补充说明

  • 边界处理:空列表会抛出empty_list错误,单元素列表直接返回值(无需并行计算)
  • 并行粒度:当前实现采用二分法拆分列表,如果需要更细粒度的并行(比如处理超大型列表),可以修改split_list函数,将列表拆分成更多子块,进一步提升并发效率
  • 可靠性:如果需要更健壮的错误处理(比如捕获进程异常),可以在spawn后添加监控逻辑,不过基础版本已经能满足常规场景需求

内容的提问来源于stack exchange,提问作者reverb1010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:52:01