ПРИМЕЧАНИЕ: Я буду использовать ssh_sftp
канал в качестве примера здесь, но я заметил то же самое поведение при использовании разных каналов.
После запуска канала:
{ok, ChannelPid} = ssh_sftp:start_channel(State#state.cm),
(где cm - мой диспетчер соединений ), я выполняю операцию через канал. Скажи:
ssh_sftp:write_file(ChannelPid, FilePath, Content),
Затем я останавливаю канал:
ssh_sftp:stop_channel(ChannelPid),
Поскольку, насколько мне известно, канал реализован как gen_server
, я ожидал, что запросы будут секвенированы.
Что ж, после небольшой трассировки я заметил, что канал каким-то образом остановлен до , запись файла завершена, и результат операции передается через канал. Таким образом, ответ не передается через канал, поскольку канал больше не существует.
Если я не остановлю канал явно, все будет нормально, и запись файла (или любая другая операция, выполненная через канал) будет завершена правильно. Но я бы предпочел не оставлять открытые каналы. С другой стороны, я бы предпочел избегать реализации собственного обработчика получения, чтобы дождаться результата, прежде чем канал может быть остановлен.
Я, наверное, здесь упускаю что-то тривиальное. У вас есть идея, почему это происходит, и / или я могу это исправить?
Я повторяю, ssh_sftp
это просто пример. Я использую свои собственные каналы, реализованные с использованием существующих каналов в приложении Erlang SSH в качестве шаблона.