Как загрузить много файлов одновременно в облачные файлы с помощью Python? - PullRequest
9 голосов
/ 09 марта 2011

Я использую модуль облачного файла для загрузки файлов в файлы облачного хранилища, используя что-то вроде этого псевдокода:

import cloudfiles

username = '---'
api_key = '---'

conn = cloudfiles.get_connection(username, api_key)
testcontainer = conn.create_container('test')

for f in get_filenames():
    obj = testcontainer.create_object(f)
    obj.load_from_filename(f)

Моя проблема в том, что у меня много маленьких файловдля загрузки, и это занимает слишком много времени.

В документации скрыто, я вижу, что есть класс ConnectionPool , который предположительно может использоваться для загрузки файлов в Parallell.

Может кто-нибудь показать, как я могу заставить этот фрагмент кода загружать более одного файла одновременно?

1 Ответ

8 голосов
/ 12 марта 2011

Класс ConnectionPool предназначен для многопоточного приложения, которое иногда должно что-то посылать в пространство стойки.

Таким образом, вы можете повторно использовать ваше соединение, но вам не нужно держать 100 открытых соединений, если у вас есть 100 потоков.

Вы просто ищете многопоточный / многопроцессорный загрузчик. Вот пример использования библиотеки multiprocessing:

import cloudfiles
import multiprocessing

USERNAME = '---'
API_KEY = '---'


def get_container():
    conn = cloudfiles.get_connection(USERNAME, API_KEY)
    testcontainer = conn.create_container('test')
    return testcontainer

def uploader(filenames):
    '''Worker process to upload the given files'''
    container = get_container()

    # Keep going till you reach STOP
    for filename in iter(filenames.get, 'STOP'):
        # Create the object and upload
        obj = container.create_object(filename)
        obj.load_from_filename(filename)

def main():
    NUMBER_OF_PROCESSES = 16

    # Add your filenames to this queue
    filenames = multiprocessing.Queue()

    # Start worker processes
    for i in range(NUMBER_OF_PROCESSES):
        multiprocessing.Process(target=uploader, args=(filenames,)).start()

    # You can keep adding tasks until you add STOP
    filenames.put('some filename')

    # Stop all child processes
    for i in range(NUMBER_OF_PROCESSES):
        filenames.put('STOP')

if __name__ == '__main__':
    multiprocessing.freeze_support()
    main()
...