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
相关产品推荐
相关产品推荐

