GitPython заставляет concurrent.futures.ThreadPoolExecutor игнорировать max_workers

Я пишу некоторый код Python для параллельного выполнения операций с большим количеством репозиториев git. Для этого я пытаюсь объединить concurrent.futures и GitPython, клонируя каждый репозиторий в отдельной будущей задаче. Это использует встроенный Python 2.7.6 в OS X 10.10 и с GitPython 0.3.5 и futures 2.2.0 (версия, перенесенная на 2.7), которые установлены через pip.

Простой пример кода, который я использую, выглядит следующим образом:

import time
from concurrent import futures
import shutil
import os
from git import Repo


def wait_then_return(i):
    print('called: %s', i)
    time.sleep(2)
    return i


def clone_then_return(i):
    print('called: %s', i)
    path = os.path.join('/tmp', str(i))
    os.mkdir(path)
    # clone some arbitrary repo
    Repo.clone_from('https://github.com/ros/rosdistro', path)
    shutil.rmtree(path)
    return i



if __name__ == "__main__":

    tasks = 20
    workers = 4

    with futures.ThreadPoolExecutor(max_workers=workers) as executor:

        # this works as expected... delaying work until a thread is available
        # fs = [executor.submit(wait_then_return, i) for i in range(0, tasks)]
        # this doesn't... all 20 come in quick succession
        fs = [executor.submit(clone_then_return, i) for i in range(0, tasks)]

        for future in futures.as_completed(fs):
            print('result: %s', future.result())

Когда я отправляю исполнителю функцию wait_then_return, я получаю ожидаемое поведение: печать выполняется сначала в группе из четырех, а затем примерно по этим линиям, пока не будут завершены все фьючерсы. Если я переключаю это на clone_then_return, то создается впечатление, что исполнитель игнорирует аргумент max_workers и запускает все двадцать фьючерсов параллельно.

Что может быть причиной этого?


person Nick Hawes    schedule 23.01.2015    source источник


Ответы (1)


На самом деле вызов git, который я использовал, имел некоторые проблемы с аутентификацией, из-за которых будущее выполнялось быстро. В мире параллелизма все по-прежнему разумно.

person Nick Hawes    schedule 23.01.2015
comment
Не могли бы вы пометить этот вопрос ответом, если в конце концов это не проблема, связанная с gitpython? - person Byron; 28.01.2015
comment
Упс, забыл. Готово. - person Nick Hawes; 29.01.2015