「erlangプログラミング」という本とこのスタックオーバーフローの質問では、以下を使用してメールボックス内のerlangメッセージにさまざまな優先順位を付けることができることを確認しました。
私はこのコードで似たようなものを実装しようとしました:
-module(mytest).
-export([start/0, test/0]).
start() ->
register(?MODULE, spawn(fun() -> do_receive() end)).
do_receive() ->
receive
{high_p, Message} ->
io:format("High priority: ~p~n", [Message]),
do_receive()
after 0 ->
receive
{low_p, Message} ->
io:format("Low priority: ~p~n", [Message]),
do_receive()
end
end.
test() ->
mytest ! {high_p, msg1},
mytest ! {low_p, msg2},
mytest ! {high_p, msg3}.
しかし、結果は次のとおりです。
1> mytest:start().
true
2> mytest:test().
Low priority: msg2
{high_p,msg3}
High priority: msg1
High priority: msg3
これは正しくないように思われるので、コードを次のように変更しました。
do_receive() ->
receive
{high_p, Message} ->
io:format("High priority: ~p~n", [Message]),
do_receive()
after 0 ->
receive
{high_p, _} = Other ->
self() ! Other,
do_receive();
{low_p, Message} ->
io:format("Low priority: ~p~n", [Message]),
do_receive()
end
end.
結果は次のようになります(優先度の高いメッセージはすべて、優先度の低いメッセージの前に出力されます)。
1> mytest:start().
true
2> mytest:test().
High priority: msg3
{high_p,msg3}
High priority: msg1
Low priority: msg2
これは私の目標を達成するための正しい方法ですか?そして、gen_server handle_info / 2内で異なる優先順位を達成できますか?