me2*_*me2 10 concurrency erlang haskell transactional-memory
考虑以下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").
Run Code Online (Sandbox Code Playgroud)
输出是:
Root finished
One
Two
Final
Spawn finished
Run Code Online (Sandbox Code Playgroud)
final由于先前的接收模式与该消息不匹配,因此消息的处理基本上被推迟到最后一个接收块.
你如何使用Haskell的TChan做到这一点?
你指的是Erlang的选择性接收功能。据我所知,Haskell 中的 STM 无可比拟。您的选择是重构代码以消除对其的需要(例如对可能接收的不同类型的信息使用单独的队列),或者在库中实现此功能。
选择性接收的语义是,除了传入消息队列之外,你还有一个延迟消息列表。在接收函数中,您需要首先扫描延迟列表以查找任何匹配的消息。如果消息匹配,则您可以将其从列表中删除并发送。如果没有匹配的延迟消息,则您需要等待收件箱中的消息。收到消息后,您检查它是否匹配。如果是,那么你就交付它;如果没有,则将其推入延迟列表并重复。