【问题标题】:What is the detail of the erlang select receive mechanismerlang select接收机制的细节是什么
【发布时间】:2022-01-09 14:31:37
【问题描述】:

看过一篇关于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,[]}]

文章链接:https://blog.ndpar.com/2010/11/10/erlang-selective-receive/

【问题讨论】:

    标签: erlang erlang-otp erlang-shell


    【解决方案1】:

    这种“保存队列”的可见状态的奇怪行为仅在 shell 中运行的解释代码中是正确的,而不是在常规编译模块中。在实际的接收 C 实现中,只有一个队列带有一个指针来跟踪到目前为止已扫描哪些队列,并且 process_info 在实际接收期间不会显示空队列。解释代码的行为在 R16B01 中被修复,所以现在没有明显的区别:https://github.com/erlang/otp/commit/acb8ef5d18cc3976bf580a8e6925cb5641acd401

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 1970-01-01
      • 2017-07-30
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2013-01-22
      相关资源
      最近更新 更多