Модель параллелизма Эрланга - PullRequest
0 голосов
/ 07 октября 2011

Это может быть очень простой вопрос, но способен ли Эрланг вызвать метод для другой prcoess и подождать, пока он ответит обратно с каким-либо типом объекта без спящих потоков?

Ответы [ 3 ]

1 голос
/ 08 октября 2011

Да, в почтовый ящик можно заглянуть, если вы это имеете в виду. Скажем, мы отправили сообщение другому процессу, и теперь мы хотим посмотреть, отправил ли нам другой процесс что-то обратно. Но мы не хотим блокировать при получении:

 receive
    Pattern -> Body;
    Pattern2 -> Body2
 after 0 ->
    AfterBody
 end

попытается сопоставить значения Pattern и Pattern2 в почтовом ящике. Если ни один из них не подходит, он сразу же отключится и перейдет к AfterBody. Это позволяет реализовать неблокирующий просмотр в почтовом ящике.

Если процесс является gen_server, то же самое можно получить, играя с внутренним состоянием и настройкой Timeout, когда обратный вызов возвращается к элементу управления gen_server. Вы можете установить время ожидания 0 для достижения этой цели.

1 голос
/ 07 октября 2011

Что ж, если вы ждете ответа, процесс вызова в конечном итоге должен будет заснуть ... Но это не имеет большого значения.

Пока процессы застряли в цикле receive, могут работать другие процессы. На самом деле, тысячи процессов просто ждут сообщений. А поскольку процессы Erlang не являются настоящими потоками ОС, они очень легкие, поэтому потеря производительности минимальна.

На самом деле способ реализации сна выглядит так:

sleep(Milliseconds) ->
    receive
        % Intentionally left empty
    after Milliseconds -> ok
    end.
0 голосов
/ 08 октября 2011

Вопрос в том, что мы говорим о Synchronous Message Passing.ДА !Erlang может сделать это на отлично, это самый простой способ обработки параллелизма в Erlang.Рассмотрим это ниже:

rpc(Request, To)->
  MySelf = self(),
  To ! {MySelf,Request},
  receive
     {To,Reply} -> Reply
  after timer:seconds(5) -> erlang:exit({error,timedout})
  end.

Приведенный выше код показывает, что процесс отправляет сообщение другому и немедленно переходит в ожидание (для ответа) без необходимости спать.Если он не получит ответ в течение 5 секунд, он завершится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...