Неожиданное поведение с as_completed в concurrent.futures с использованием python. - PullRequest
0 голосов
/ 09 ноября 2018

Я борюсь с использованием concurrent.futures в python. Я пытаюсь перебрать большое количество объектов S3. Из-за количества учетных записей, групп и объектов это может занять очень много времени. Дольше, чем мои учетные данные STS хороши, и достаточно долго, я не верю, что сценарий не будет прерван.

Я ожидал бы, что следующий код будет работать, и, хотя он действительно производит вывод, который я ищу, при тестировании с небольшим количеством сегментов, он записывает только в завершенные и завершенные файлы после полной обработки каждого сегмента, а не после каждого будущего. возвращается. В случае прерывания завершенные и отсутствующие файлы не записываются. Даже если много ведер уже успешно обработано.

if __name__ == '__main__':
    args_results = parser.parse_args()

    completed = open(args_results.completed, 'a+')
    out = open(args_results.out, 'a+')  

    done = getCompleted(args_results.completed) 
    todo = getBuckets(args_results.todo)

    with ThreadPoolExecutor(max_workers=10) as executor:
        futures = []
        for item in todo: 
            if item not in done:
                account, bucket = item.split('|')
                futures.append(executor.submit(getBucketInfo, account, bucket))

        for x in as_completed(futures):
            result = x.result()
            out.write(result + '\n')
            completed.write(result['Account'] + '|' + result['Bucket'] + '\n')

Я неправильно понимаю, как должна работать функция as_completed ()?

1 Ответ

0 голосов
/ 09 ноября 2018

Мне нужно было добавить буферизацию строк при открытии файлов, чтобы они записывались на диск с каждой записанной строкой.

completed = open(args_results.completed, 'a+', buffering=1)
out = open(args_results.out, 'a+', buffering=1)

Проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...