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

Erlang发送进程能否阻塞至消息完成投递至接收进程队列?

Erlang中消息投递确认的实现需求

在Erlang里,有个常用的模拟同步通信的技巧,代码如下:

%% Process 'sender'
Ref = make_ref(),
'receiver' ! {self(), Ref, Message},
receive {ack, Ref} -> ok end,
...


%% Process 'receiver'
receive
    {From, Ref, Message} ->
         From ! {ack, Ref},
         handle_msg(Message),
         ...
end

这个技巧能让发送进程(sender)阻塞,直到接收进程(receiver)处理完消息。但我需要的是让发送进程阻塞到消息完成投递——也就是消息进入接收进程的消息队列就够了。这点很关键,因为我想依赖消息入队的顺序假设,不需要等消息被取出处理(哪怕永远不被处理也没关系)。

举个例子,现有如下代码:

%% Process 'sender'
send_deliver('receiver', first),
'proxy' ! second


%% Process 'receiver'
receive
  unlock -> ok
end,
receive
  X -> X
end


%% Process 'proxy'
receive
  X -> 'receiver' ! X
end


%% Process 'unlocker'
timer:sleep(thousand_years()),
'receiver' ! unlock

我的核心目标是:

  • receiver 必须先接收first再接收second(编辑:除非它监听的模式不匹配first但匹配second)
  • 消息负载不影响顺序逻辑:比如如果交换first和second的发送顺序,那second必须先被接收
  • 调用send_deliver/2时,发送进程的阻塞时长不能受接收进程状态影响(尤其不能被迫等上几千年)
  • 可以接受用元组包装消息并添加额外信息,就像前面的同步发送技巧那样

另外,我希望保留所有原生的消息过滤能力,以及所有关于消息顺序的假设。请问Erlang里有没有内置的技巧或者可模拟这类语义的设计模式?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:42:34