Проблема с прерыванием соединения с сетевой папкой во время записи файла
Мне нужно передавать файл в сетевую папку с помощью пайтон (пример кода асинхронный, ибо в контексте моего приложения желателен такой подход, но с синхронным примерно та же проблема), сделать это можно следующим образом, примонтировать сетевую папку с помощью cifs в линукс:
sudo mount -t cifs -o username=your_username,password=your_password,file_mode=0777,dir_mode=0777 //vm_ip/shared_folder /mnt/share
async def consumer(queue: asyncio.Queue, filepath: str):
async with aiofiles.open(filepath, "wb") as file:
while True:
chunk = await queue.get()
if not chunk:
break
await file.write(chunk)
Все отлично работает, файл передается в удаленный ресурс, но если соединение с сетевой папкой прервется, то код просто зависает вот здесь await file.write(chunk), wait_for и подобное не помогает отменить эту строчку, и эта задача будет висеть до конца, с синхронным вариантом происходит тоже самое. Процесс пайтон даже убить через консоль не получается при разрыве соединения, помогает только перезагрузка.
Делал так, расшаривал сетевую папку на виртуальной машине, вырубал её, происходит эффект описанный выше, подумал проблема в VM, расшарил на другом компе, обрубал сеть с ним, эффект тот же.
Пробовал использовать специализированные библиотеки для этих целей, типо smbclient, pysmb и там эффект похожий получался, не настолько, чтобы процесс убить нельзя было, но код тоже просто останавливается на записи чанка и никакого исключения там не всплывает, вот пример:
smbclient.register_session(
address,
username=login,
password=password,
connection_timeout=10,
)
file = smbclient.open_file(rf"\\{address}\{full_path}", "wb")
file.write(chunk)
smbclient.delete_session(self.address, timeout=5)
Пробовал stopit, не помогает.
Есть у кого идеи, что тут можно сделать или это особенность smb протокола и тут ничего особо не сделаешь? Мне просто важно обрабатывать такие случае для надежности приложения.
Ответы (1 шт):
Не уверен, что это поможет в конкретно вашем случае, но общение с ресурсами лучше заворачивать в контекстный менеджер.
with smbclient.open_file(r"\\server\share\directory\file.txt", mode="w") as fd:
fd.write(u"file contents")