LINUX.ORG.RU

как правильно записывать файлы из асинхронных функций?

 ,


0

2

Собственно сабж.

Отдельный поток?

На примере python.

Не код прошу, а «лучшие методики» (best practices).

★★★★★

Последнее исправление: sniper21 (всего исправлений: 1)

Нельзя ответить на вопрос «как» не ответив сперва на вопрос «зачем»

Goury ★★★★★
()
Ответ на: комментарий от sniper21

На самом деле в большинстве операционных систем нет поддержки асинхронных операций с файлами. Поэтому и в asyncio её нет. Все существующие сторонние реализации, такие как этот самый aiofiles (как и реализации в других языках, например в node.js) внутри используют пул тредов. Если не хочешь использовать стороннюю реализацию, я не вижу ничего зазорного использовать отдельный тред. Но нужно хорошо понимать, что ты делаешь.

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

нужно качать с интернета файлы и записывать их. Синхронно это очень долго. Асинхронно качать не проблема - проблема как-то их записать.

А вот SSD диск по идее может писать асинхронно... или существует какое-то глобальное ограниение?

sniper21 ★★★★★
() автор топика
Последнее исправление: sniper21 (всего исправлений: 2)
Ответ на: комментарий от sniper21

давайте расскажите нам что означает писать на диск асинхронно
как раз и сами разберетесь и остальные вопросы пропадут

anonymous
()

если пишешь именно на диск, локально, не по, например, NFS, то асинхронность вообще не нужна.

в общем случае, бери aiofiles, и норм. если чего-то не будет хватать, форкнешь

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

то асинхронность вообще не нужна.

Где не нужна? При скачивании файлов? При записи на диск?

sniper21 ★★★★★
() автор топика

Как собираетесь записывать файл из нескольких потоков одновременно? Синхронизировать очерёдность? Не стоит 1000 раз переоткрывать файлы, большые расходы. Создаёте отдельный тред для записи файлов, ему скармливаете всё что надо записать.

anonymous
()
Ответ на: комментарий от anonymous

Как собираетесь записывать файл из нескольких потоков одновременно?

Мне так не надо. Мне надо скачать файл и записать его на диск, скачать другой и записать его на диск.

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Ну тогда создаёте отдельный поток для записи файлов, он динамически создаёт тредов в пределах ожидаемого количества соединений, по 1 на каждое соединение. В него скачивающий процесс из своих тредов переправляет свои данные. Но это может быть оверинжиниринг, зависит от задач. Обычно достаточно отдельный пул тредов для скачивания и отдельный 1 тред с очередью на запись на диск, в одном процессе. Только это возможно будет медленней чем много потоков из-за GIL, надо тестировать нагрузки.

anonymous
()
Ответ на: комментарий от anonymous

чем много потоков

Чем много процессов, извините. Я просто думал как эта вся терминология на русский переводится.

anonymous
()
Ответ на: комментарий от anonymous

отдельный поток

отдельный процесс, у меня плохо с русским

anonymous
()
Ответ на: комментарий от sniper21

качаете и то что скачиваете - пишите сразу на диск все гениальное - просто

anonymous
()

Асинхронность здесь, кажется, ни при чем.

Если качаешь файлы параллельно, то и писать их будешь параллельно (например, повесив коллбеки на скачивание или каким-то другим образом скомпозировав эти две процедуры).

А если качаешь один файл кусками (типа как торренты, но я думаю, что тебе это не нужно, иначе бы ответ знал и так), можно синхронизироваться любым удобным способом и скакать по файлу, записывая куски. Можно что-то типа mmap (погугли python memory mapped file), но вообще - это не то, что тебе нужно, просто для кругозора.

Покажи код лучше, как качаешь, а то кажется, что сам не знаешь, что хочешь.

cdshines ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.