Является ли опрос блока приема в erlang хорошей практикой?

Я новичок в Erlang и у меня есть вопрос о блоке приема. Я пытаюсь получить одно или несколько сообщений от дочернего процесса, выполняющего задачу. Я узнал, как получить сообщение, с помощью блока приема.

Например

      main() ->
    spawn(module, performSomething, []),
    receiveSomething().

receiveSomething() ->
    receive
        Var -> handleIt
    end,
    receiveSomething(). 

Вопрос 1. Предполагая, что ребенок может отправлять несколько сообщений родителю, которому необходимо обрабатывать сообщения, является ли хорошей практикой «опрос» этого блока приема? Например, вот как это нужно делать?

Вопрос 2: Такое ощущение, что это какое-то напряженное ожидание, не так ли? Например, вызывает ли это проблемы с производительностью?

Вопрос 3: В Objective-C я бы использовал делегатов для получения обратных вызовов и избегал опроса. Есть ли альтернативы в Erlang?

1 ответ

  1. Да, так и должно быть. Это не опрос: при выполнении поток сканирует свой почтовый ящик на наличие соответствующего сообщения, если оно найдено, он продолжает, если сообщение не найдено, планировщик (поток ОС, на котором запущена виртуальная машина) приостанавливает выполнение потока до тех пор, пока доступно соответствующее сообщение (или время ожидания истекает, если таковой имеется).
  2. Нет, это не занятое ожидание, потому что receiveблокируется до тех пор, пока не появится подходящее сообщение. Вы можете легко проверить это с помощью io:format() или же dbg.
  3. Вот что вы здесь делаете: «родительский» поток порождает некоторые другие потоки для выполнения некоторой задачи и отчета. «Родительский» поток просто ждет завершения всех задач.
  4. Вы должны использовать spawn_link или же spawn_monitor, иначе «дочерний» поток может умереть, а «родительский» будет вечно ждать сообщения, которое не придет.
Другие вопросы по тегам