Отправка сообщения в Erlang - асинхронный , означающий, что выражение отправки, такое как PidB ! msg
, вычисленное процессом PidA
, немедленно дает результат msg
, не блокируя последний.Естественно, его побочным эффектом является отправка msg
на PidB
.
Поскольку этот режим передачи сообщений не обеспечивает какие-либо гарантии доставки сообщений,отправитель должен сам выяснить, действительно ли сообщение было доставлено, попросив получателя подтвердить это.В конце концов, подтверждение того, было ли доставлено сообщение, не всегда требуется.
Это верно как в локальном, так и в распределенном случаях: в последнем сценарии отправитель не может просто предположить, что удаленный узел всегда доступен;в локальном сценарии, где процессы находятся на одном и том же узле Erlang, процесс может отправить сообщение несуществующему процессу.
Мне любопытно, как часть побочных эффектов !
, т.е. , отправка сообщений, работает на уровне виртуальной машины, когда процессы отправителя и получателя находятся на одном и том же узле *1022*.В частности, я хотел бы знать, завершается ли операция отправки, прежде чем вернуться.Под завершением я имею в виду, что для конкретного случая локальных процессов отправитель: (i) получает блокировку в очереди сообщений получателя, (ii) записываетсообщение прямо в его очередь, (iii) снимает блокировку и, (iv) наконец возвращается.
Я натолкнулся на этот пост , который я до конца не понял, хотя, кажется, это указывает на то, что это может быть так.