Пересылать файлы в S3 используя Multithreading в Пайтоне

У меня есть папка с тысячами файлов, что пересылать мой S3, пока это реализовало так, без проблем:

for x in images_full_path:
        data = open(x,'rb')
        name_file = os.path.basename(x)

        s3.Bucket(bucket_name).put_object(Key=AWS_folder_name+name_file, Body = data)

Как он мог бы ускорять процесс upload добавляя несколько конкурирующих трэдов?

2
задан 11.07.2017, 19:15
1 ответ

Со мной случается, что mÃ: s простой, который ты можешь делать, состоит в том, чтобы пробовать использовать класс Pool из m¦dulo multiprocessing:

from multiprocessing import Pool

def upload_to_s3(file):
    # Acá va tu magia para subir los archivos


def main():
    images_full_path = [...] # Tus archivos
    pool = Pool()
    pool.map(upload_to_s3, images_full_path)

то, что идет делать, из-за каждого элемента в images_full_path применять к нему funci¦n upload_to_s3. В этом funci¦n должен быть c¦digo, чтобы подниматься в S3, как ты это делал.

Pool использует некое количество "workers", чтобы выполнять работу в параллели. Если ты не происходишь с ним expl¦-citamente número "workers" usarÃ: количество CPUs.

не использует трэды (threads), но возможно ты будьте útil, чтобы начинаться.

2
ответ дан 24.11.2019, 07:35
  • 1
    Если upload_to_s3 нуждается в большем количестве переменных в часть (file), как я могу перемещать их его? Прощение, но я не знакомился pool.map – Xavi 11.07.2017, 20:02
  • 2
    @Xavi верьте в список с tuplas или словари с аргументами и ты распаковываешь их в funció n прямо как любой iterable или используя синтаксис *args / **kwargs. Другая opció n он состоит в том, чтобы использовать pool.starmap(), aquí у тебя есть вопрос сайта в inglé s, где они показывают mú ltiples выборы (между ними, что я комментирую тебе), чтобы перемещать несколько аргументов в funció n цель в pool.map: stackoverflow.com/q/5442910/7131499 . Привет. – FJSevilla 11.07.2017, 20:34
  • 3
    Я funcionó в perfecció n. Большое спасибо! – Xavi 12.07.2017, 10:53