Size: a a a

2020 October 31

FS

Filipp Samoilov in Rust Async
temporary file дает объект файла. У меня же есть только путь, т.к. либа, которую я пользую (hdf5) работает с путями
источник

FS

Filipp Samoilov in Rust Async
async удаление после чтения нужно
источник

A

Alexander in Rust Async
не оч понял, сорян
источник

AI

Alex Ilizarov in Rust Async
Filipp Samoilov
Доброго времени суток всем.
Я пишу сервис на warp, который должен стримить большие временные файлы.
Пока что файлы просто накапливаются в /tmp/ и кронячка файлы старше часа чистит.
Хочется сделять стрим, который бы за собой подчищал эти файлы после отдачи.
Простым гуглением "rust async temporary file" ничего не нашлось. Наталкивался ли кто на готовый ящик для такой идеи?
tempfile не катит?
источник

AI

Alex Ilizarov in Rust Async
Он там на механизмы ОС рассчитывает для очистки
источник

AI

Alex Ilizarov in Rust Async
Filipp Samoilov
async удаление после чтения нужно
В токио экосистеме вообще асинхронных линуксовых файлов нету (io_uring) только поточное все. В асинк экосистеме нет асинк дропов еще
источник

AI

Alex Ilizarov in Rust Async
Так что думаю что механизмы ос лучше всего
источник

FS

Filipp Samoilov in Rust Async
я туда и посмотрел сначала, но

во-первых
pub fn tempfile() -> Result<File>
File - это A reference to an open file on the filesystem.
А либа, которой я пользуюсь оперирует путями, и патчить ее выше моих сил и способностей.

во-вторых
The file will be created in the location returned by std::env::temp_dir().
std::env::temp_dir() это /tmp и там файлы очищаются при перезагрузке, что с контейнерами не происходит и приходится корячиться с кронячкой.
источник

FS

Filipp Samoilov in Rust Async
я не про асинк дроп, а про очищение как часть итерации стрима, то есть на синхронном питоне это вот так бы выглядело
fn iter_file_and_delete(fname):
   for line in open(fname):
       yield line
   os.remove(fname)
источник

FS

Filipp Samoilov in Rust Async
Alexander
не оч понял, сорян
сорян, у меня плохо с естественными языками, попробовал кодом объяснить ^
источник

FS

Filipp Samoilov in Rust Async
ну вобщем по реакции чата похоже это не очень широко распространенная проблема, попробую сам запилить тогда
источник

RG

Random Guy in Rust Async
async fn read_file() {}

read_file.and_then(delete_file).await

Сделай себе условно такую штуку
источник

FS

Filipp Samoilov in Rust Async
Random Guy
async fn read_file() {}

read_file.and_then(delete_file).await

Сделай себе условно такую штуку
ага я думал может ящик для этого есть уже
источник

FS

Filipp Samoilov in Rust Async
там много подводных камней просто, закрыть файл перед удалением, удаление сделать в отдельном треде, на редкий случай если оно заблочится (такое вообще возможно? наверное да, системный вызов же)
источник

IB

Ivan Boldyrev in Rust Async
Filipp Samoilov
там много подводных камней просто, закрыть файл перед удалением, удаление сделать в отдельном треде, на редкий случай если оно заблочится (такое вообще возможно? наверное да, системный вызов же)
Возможно, поэтому удаление нужно делать во всяких spawn_blocking.
источник

FS

Filipp Samoilov in Rust Async
ага
источник

AI

Alex Ilizarov in Rust Async
Filipp Samoilov
я туда и посмотрел сначала, но

во-первых
pub fn tempfile() -> Result<File>
File - это A reference to an open file on the filesystem.
А либа, которой я пользуюсь оперирует путями, и патчить ее выше моих сил и способностей.

во-вторых
The file will be created in the location returned by std::env::temp_dir().
std::env::temp_dir() это /tmp и там файлы очищаются при перезагрузке, что с контейнерами не происходит и приходится корячиться с кронячкой.
Во первых у него есть билдер с путями к файлу
источник

AI

Alex Ilizarov in Rust Async
Во вторых у меня в dbg!() Файл без путей писался типа /tmp/#3432 (deleted)
источник

AI

Alex Ilizarov in Rust Async
Там тоже не дураки крейт писали.
источник

AI

Alex Ilizarov in Rust Async
Filipp Samoilov
я не про асинк дроп, а про очищение как часть итерации стрима, то есть на синхронном питоне это вот так бы выглядело
fn iter_file_and_delete(fname):
   for line in open(fname):
       yield line
   os.remove(fname)
У тебя есть овнер файла который держит дескриптор и этот овнер реализует Read. Поидее когда он дропается - удаляет файл
источник