10

考虑以下 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

final由于先前的接收模式与该消息不匹配,消息的处理基本上被推迟到最后一个接收块。

你如何用 Haskell 的 TChan 做到这一点?

4

1 回答 1

3

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

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

于 2010-03-03T19:48:40.837 回答