В моем случае это могут быть файлы размером в несколько ГБ, и я не хочу хранить их в памяти.
Если я прав и в вашем коде одиночный aws
означает загрузку одного файла, вы можете столкнуться со следующей проблемой: в то время как as_completed
позволяет обмениваться данными из оперативной памяти на жесткий диск как можно скореевсе ваши aws
работают параллельно, сохраняя все свои данные (буфер с частично загруженным файлом) в ОЗУ одновременно.
Чтобы избежать этого, вам нужно использовать семафор, чтобы гарантировать, что не много файлов загружаются параллельно впервое место, таким образом, чтобы предотвратить чрезмерное использование ОЗУ.
Вот пример использования семафор .
Разве это не вводит поток (если по умолчанию я использую ThreadPoolExecutor) что делает эту асинхронную многопотоковую программу более чем асинхронной однопоточной программой?
Я не уверен, я понимаю ваш вопрос, но да, ваш код будет использовать потоки, нотолько save_result
будет выполняться внутри этих потоков.Весь другой код все еще выполняется в одном основном потоке.Ничего плохого в этом нет.
Далее, гарантирует ли это, что в файл в любое время записывается только 1 ранее самый ранний результат?
Да, это [*].Чтобы быть точно ключевым словом await
в последней строке вашего фрагмента, это будет гарантировано:
_ = await loop.run_in_executor(None, save_result, earliest_result)
Вы можете прочитать это как: «Начните выполнение run_in_executor
асинхронно и приостановите поток выполнения в этой строке до run_in_executor
сделано и возвращен результат ".
[*] Да, если вы не запускаете несколько циклов для f in as_completed(aws)
параллельно во-первых.