Приложение разрабатывается в рамках OTP и ему требуется работать с портами ( в виде linked-in драйверов). Отсюда вытекает следующий вопрос. Если в методе handle_call gen_server'а после отсылки сообщения порту поставить receive, то мне кажется он должен будет перехватывать не только сообщения, идущие от порта, но также и сообщения, которые могут придти gen_server'у от вы?естоящих процессов. Если я прав, то есть ли какой-то красивый способ работы с портами в рамках OTP.
-
Отправлено 1 год назад #
-
Да, конечно receive будет пытаться перехватывать все сообщения. Селективный прием только сообщений от порта оставит все остальные сообщения в очереди. Но конечно это не соответствует OTP. Ресивы в нескольких местах - это как-то криво.
Красивее к ген-серверу делать асинхронные обращения cast. В handle-cast ген-сервер пусть отправляет сообщения в порт. Прием данных из порта - через handle_info. ? соответственно асинхронный ответ из ген-сервера.
Отправлено 1 год назад # -
Что за селективный receive? Можете подсказать?
Отправлено 1 год назад # -
Селективный - это когда стоят определенные ?аблоны приема и все. Типа такого:
receive
{Port, {port_answer, Data}} -> Actions
end.Если придет сообщение, которое не удовлетворяет ?аблону, оно не будет обработано. А останется в очереди процесса.
Отправлено 1 год назад #
