Erlang select 接收机制的细节是什么?
What is the detail of the Erlang select receive mechanism?
我看过一篇关于Erlang select接收机制的文章,文章末尾有一个结论:“消息从邮箱移动到保存队列,然后再回到邮箱匹配的消息到达”。我已经尝试了文章中显示的示例,但无法得到相同的结果。这是我的代码,我的 erlang/otp 版本是 21.
shell1:
(aaa@HW0003727)1> register(shell, self()).
true
(aaa@HW0003727)2> shell ! c, shell ! d.
d
(aaa@HW0003727)3> process_info(whereis(shell),messages).
{messages,[c,d]}.
(aaa@HW0003727)4> receive a -> 1; b -> 2 end.
shell2:
(aaa@HW0003727)1> process_info(whereis(shell),messages).
{messages,[c,d]}
(aaa@HW0003727)2> process_info(whereis(shell)).
[{registered_name,shell},
{current_function,{prim_eval,'receive',2}},
{initial_call,{erlang,apply,2}},
{status,waiting},
{message_queue_len,2},
{links,[<0.113.0>]},
{dictionary,[]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.112.0>},
{total_heap_size,4212},
{heap_size,1598},
{stack_size,30},
{reductions,13906},
{garbage_collection,[{max_heap_size,#{error_logger => true,kill => true,size => 0}},
{min_bin_vheap_size,46422},
{min_heap_size,233},
{fullsweep_after,65535},
{minor_gcs,1}]},
{suspending,[]}]
这种带有“保存队列”可见状态的奇怪行为仅在 shell 中的解释代码 运行 中存在,而在常规编译模块中则不存在。在接收的实际 C 实现中,只有一个队列有一个指针来跟踪到目前为止已经扫描了哪些队列,并且 process_info 在实际接收期间不会显示空队列。解释代码的行为在 R16B01 中得到修复,所以现在没有明显的区别:https://github.com/erlang/otp/commit/acb8ef5d18cc3976bf580a8e6925cb5641acd401
我看过一篇关于Erlang select接收机制的文章,文章末尾有一个结论:“消息从邮箱移动到保存队列,然后再回到邮箱匹配的消息到达”。我已经尝试了文章中显示的示例,但无法得到相同的结果。这是我的代码,我的 erlang/otp 版本是 21.
shell1:
(aaa@HW0003727)1> register(shell, self()).
true
(aaa@HW0003727)2> shell ! c, shell ! d.
d
(aaa@HW0003727)3> process_info(whereis(shell),messages).
{messages,[c,d]}.
(aaa@HW0003727)4> receive a -> 1; b -> 2 end.
shell2:
(aaa@HW0003727)1> process_info(whereis(shell),messages).
{messages,[c,d]}
(aaa@HW0003727)2> process_info(whereis(shell)).
[{registered_name,shell},
{current_function,{prim_eval,'receive',2}},
{initial_call,{erlang,apply,2}},
{status,waiting},
{message_queue_len,2},
{links,[<0.113.0>]},
{dictionary,[]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.112.0>},
{total_heap_size,4212},
{heap_size,1598},
{stack_size,30},
{reductions,13906},
{garbage_collection,[{max_heap_size,#{error_logger => true,kill => true,size => 0}},
{min_bin_vheap_size,46422},
{min_heap_size,233},
{fullsweep_after,65535},
{minor_gcs,1}]},
{suspending,[]}]
这种带有“保存队列”可见状态的奇怪行为仅在 shell 中的解释代码 运行 中存在,而在常规编译模块中则不存在。在接收的实际 C 实现中,只有一个队列有一个指针来跟踪到目前为止已经扫描了哪些队列,并且 process_info 在实际接收期间不会显示空队列。解释代码的行为在 R16B01 中得到修复,所以现在没有明显的区别:https://github.com/erlang/otp/commit/acb8ef5d18cc3976bf580a8e6925cb5641acd401