Я пытаюсь загрузить кучу файлов с S3 в python.Чтобы ускорить его, я использую
def sync(self):
def wait_for_job(job):
(src_filename, dst_filename, f) = job
try:
result = f.result()
logging.info("Download ok: {}, result={}".format(dst_filename, result))
except IOError as e:
logging.info("Download error: {} - {}".format(dst_filename, e))
self.projectInfo.downloaded_files[src_filename] = 0
while self.pending_jobs:
wait_for_job(self.pending_jobs.pop(0))
def getFiles(files_to_download):
for src, dst in files_to_download:
self.pending_jobs.append( (src, dst, self.executor.submit(s3_ops.copy_file, src, dst)) )
Теперь я хотел бы использовать concurrent.futures.as_completed()
.Поскольку он принимает список фьючерсов, я не могу передать ему self.pending_jobs
(это список кортежей).
Я мог бы сделать self.pending_jobs
просто списком фьючерсов, функция которого возвращала бы не толькорезультат, но также src и dst:
def sync(self):
def wait_for_job(f):
try:
(src_filename, dst_filename, result) = f.result()
logging.info("Download ok: {}, result={}".format(dst_filename, result))
except IOError as e:
### Can't get the value of dst_filename
logging.info("Download error: {} - {}".format(dst_filename, e))
self.projectInfo.downloaded_files[src_filename] = 0
for job in concurrent.futures.as_completed(self.pending_jobs):
wait_for_job(job)
def getFiles(files_to_download):
for src, dst in files_to_download:
l = lambda s, d: (s, d, ops.copy_file(s, d))
self.pending_jobs.append( self.executor.submit(l, src, dst) )
Я бы получил их после вызова future.result()
, как часть кортежа, который он возвращает.Но в случае исключения я не смог бы ничего получить.
Есть ли способ сделать это?Я ожидал бы as_completed
, включая некоторый параметр в строке key
в sorted
(то есть, чтобы он знал, как извлечь будущее из элемента в списке), но его там нет.