2014-11-26 3 views
0

Если у меня есть процесс A, который вызывает вызов функции в процессе B (procB: func().), А функция func() генерирует ошибку во время выполнения. Процесс B прекратится, но как насчет процесса A? Рассмотрим следующий пример, в процессе А:Отключенный процесс Erlang завершается

Случай 1:

{ok, Reply} = procB:func(). 

Случай 2:

procB:func(). 

будет обрабатывать оканчиваются в обоих случаях? Или просто в случае 1 из-за несоответствия? Обратите внимание, что эти два процесса не связаны.

Заранее благодарен!

+1

что такое procB? это модуль? в этом случае функция func() будет выполнена в процессе A.Если procB - это зарегистрированное имя процесса, вы не можете вызвать func() в procB таким образом. Вам нужно отправить сообщение procB и дождаться ответа. –

+0

'procB: func()' - вызов другого _module_, не обязательно вызов другого _process_. Ответ на этот вопрос зависит от того, что делает 'procB: func'. – legoscia

ответ

2

Нет такой функции, как вызов функции в другом процессе, вы можете отправить сообщение процессу, который затем может выбрать вызов функции на основе содержимого сообщения.

gen_servers работают таким образом, вы отправляете сообщение gen_server, и оно соответствует сообщению и выбирает, следует ли ему вызывать функции call/cast/info/terminate.

Предполагая, что вы на самом деле говорим о передаче сообщений от А до Б и В решает выйти, это все о том, если процесс А связан/процесс мониторинга B.

Если монитор B, вы послали сообщение говоря, что Б спустился и причина. Если вы связаны с B, я верю, что правило: вы убиты, если B умер со статусом, отличным от «нормального»

Возможно, также был установлен флаг trap_exit, что означает, что даже если связь и B умирают, A отправляется сообщение о том, что он должен умереть, и вы можете взаимодействовать с этим сообщением (например: вы можете перезапустить B, если вы выберете)

learn you some erlang имеет хороший учебник о том, как это работает.

1

Вы не можете вызвать функцию в другом процессе. Такова красота Эрланга: всякая связь между процессами происходит через передачу сообщений. Люди иногда путают модули с процессами. Я даже написал article about it.

Для примера процесса A:

  • нерестится Процесс B
  • посылает сообщение, которое, например, кортеж {fun_to_call, Args, self()} (вам нужно self() знать, где ответить
  • ожидания отклика с помощью receive

Способ B:

  • сразу же после запуска ожидает сообщение
  • когда получает сообщение, делает некоторые вычисления и посылает ответ назад

Это выглядит как много шаблонного, так что это точная модель абстрагируется в gen_server

Смежные вопросы