Какова деталь механизма приема выбора erlang

Я прочитал статью о механизме получения 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/

1 ответ

Это странное поведение с видимым состоянием «очереди сохранения» было верно только в интерпретируемом коде, работающем в оболочке, а не в обычных скомпилированных модулях. В фактической реализации получения на языке C есть только одна очередь с указателем, чтобы отслеживать, какие из них уже были просканированы, а process_info не показывает пустую очередь во время реального приема. Поведение интерпретируемого кода было исправлено еще в R16B01, так что сейчас видимой разницы нет: https://github.com/erlang/otp/commit/acb8ef5d18cc3976bf580a8e6925cb5641acd401

Другие вопросы по тегам