Вы также можете установить гнездо gen_tcp в пассивном режиме. Таким образом, процесс-владелец не получит входные данные сообщениями, но должен извлечь их, используя gen_tcp: recv (Socket, ByteCount) , который возвращает либо {ok, Input} или {ошибка, причина} . Поскольку этот метод бесконечно ждет байтов, вы можете добавить время ожидания, используя gen_tcp: recv / 3 . ( Erlang документация gen_tcp: recv )
Хотя на первый взгляд может показаться, что процесс теперь совершенно не может реагировать на отправленные ему сообщения, существует следующий обходной путь, который немного улучшает ситуацию:
f1(X) ->
receive
message1 ->
... do something ...,
f1(X);
message2 ->
... do something ...,
f1(X)
after 0 %timeout in ms
{ok, Input} = gen_tcp:recv(Socket, ByteCount, Timeout),
... do something ... % maybe call some times gen_tcp:recv again
f1(X)
end.
Если вы не добавите тайм-аут в gen_tcp: recv здесь, другие процессы могут ждать целую вечность, пока f1 обработает их сообщения.