boto3 не поддерживает асинхронность ... его функции скорее блокируют, чем ожидают.Таким образом, абсолютный минимум, который нужно сделать здесь, это просто удалить await
из вызовов на download_file
, и это должно работать.
client.download_file(const.bucket_name, 'file/name.txt', '/tmp/name.txt')
print('file 1 downloaded')
client.download_file(const.bucket_name, 'file/class.txt', '/tmp/class.txt')
print('file 2 downloaded')
return True
Однако, это может иметь плохие свойства параллелизма, еслилюбые другие параллельные задачи в цикле событий потока: они будут заблокированы и не будут продолжаться во время загрузок [это сделало бы использование asyncio немного ненужным ... выполнение параллельных задач является своего рода точкой асинхронности ...]
Чтобы иметь лучшие свойства параллелизма, вы должны иметь возможность вызывать функции через run_in_executor
, который по умолчанию будет запускать переданную функцию в другом потоке.
async def download_files(loop):
await loop.run_in_executor(None, client.download_file, const.bucket_name, 'file/name.txt', '/tmp/name.txt')
print('file 1 downloaded')
await loop.run_in_executor(None, client.download_file, const.bucket_name, 'file/class.txt', '/tmp/class.txt')
print('file 2 downloaded')
return True
В качестве альтернативы, вместо того, чтобы использовать boto3 и потоки, вы можете использовать aiohttp и аутентификацию AWS "на рулоне" (полное раскрытие информации: публикация на AWS "самостоятельно")Аутентификация была написана мной)