微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使Haskell的TChan延迟邮件像Erlang的消息队列?

考虑以下Erlang代码
-module(testit).
-export([testit/0]).

testit() ->
    Pid = spawn(fun testit_proc/0),Pid ! final,Pid ! one,Pid ! two,io:format("Root finished~n").

testit_proc() ->
    receive
        one     -> io:format("One~n");
        two     -> io:format("Two~n")
    end,receive
        one     -> io:format("One~n");
        two     -> io:format("Two~n")
    end,receive
        one     -> io:format("One~n");
        two     -> io:format("Two~n");
        final   -> io:format("Final~n")
    end,io:format("Spawn finished~n").

输出为:

Root finished
One
Two
Final
Spawn finished

最终消息的处理基本上延迟到最后接收块之前,因为先前的接收模式不匹配该消息.

你怎么用Haskell的TChan这样做?

解决方法

你是指Erlang的选择性接收功能.据我所知,Haskell的STM与此并行.您的选择是重构您的代码以消除对它的需求(例如通过为可能收到的不同类型的信息使用单独的队列)或在库中实现此功能.

选择性接收的语义是除了传入的消息队列之外,还有一个延迟的消息列表.在接收功能中,您需要首先扫描延迟列表以获取任何匹配的消息.如果邮件匹配,则将其从列表中删除并提交.如果没有延迟邮件匹配,则需要等待收件箱中的邮件.当收到消息时,您检查是否匹配.如果是这样,那么你交付它;如果没有,那么你将其推送到延期列表并重复.

原文地址:https://www.jb51.cc/java/122987.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐