Как получить дополнительную информацию, связанную с python concurrent.future? - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь загрузить кучу файлов с 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 (то есть, чтобы он знал, как извлечь будущее из элемента в списке), но его там нет.

...