Как я понимаю из исходного кода, сокет send / recv (по крайней мере, gen_tcp) сводится к erlang: port_command для отправки и erlang: port_control для recv на порту сокета (см. Prim_inet.erl ).
Для port_command: «если порт занят, вызывающий процесс будет приостановлен до тех пор, пока порт больше не будет занят». Port_control также является синхронной операцией.
Поправьте меня, если я ошибаюсь, но было бы совершенно безопасно использовать несколько процессов для чтения и записи в сокет.