diff --git a/compose/const.py b/compose/const.py index 479b6af45f..709c3a10d7 100644 --- a/compose/const.py +++ b/compose/const.py @@ -1,5 +1,4 @@ -DEFAULT_MAX_WORKERS = 20 DEFAULT_TIMEOUT = 10 LABEL_CONTAINER_NUMBER = 'com.docker.compose.container-number' LABEL_ONE_OFF = 'com.docker.compose.oneoff' diff --git a/compose/utils.py b/compose/utils.py index c3316ccda8..b6ee63d037 100644 --- a/compose/utils.py +++ b/compose/utils.py @@ -2,13 +2,11 @@ import codecs import hashlib import json import logging -import os import sys from docker.errors import APIError -import concurrent.futures - -from .const import DEFAULT_MAX_WORKERS +from Queue import Queue, Empty +from threading import Thread log = logging.getLogger(__name__) @@ -18,7 +16,6 @@ def parallel_execute(command, containers, doing_msg, done_msg, **options): """ Execute a given command upon a list of containers in parallel. """ - max_workers = os.environ.get('COMPOSE_MAX_WORKERS', DEFAULT_MAX_WORKERS) stream = codecs.getwriter('utf-8')(sys.stdout) lines = [] errors = {} @@ -26,25 +23,33 @@ def parallel_execute(command, containers, doing_msg, done_msg, **options): for container in containers: write_out_msg(stream, lines, container.name, doing_msg) + q = Queue() + def container_command_execute(container, command, **options): try: getattr(container, command)(**options) except APIError as e: errors[container.name] = e.explanation + q.put(container) - with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: - future_container = { - executor.submit( - container_command_execute, - container, - command, - **options - ): container for container in containers - } + for container in containers: + t = Thread( + target=container_command_execute, + args=(container, command), + kwargs=options, + ) + t.daemon = True + t.start() - for future in concurrent.futures.as_completed(future_container): - container = future_container[future] + done = 0 + + while done < len(containers): + try: + container = q.get(timeout=1) write_out_msg(stream, lines, container.name, done_msg) + done += 1 + except Empty: + pass if errors: for container in errors: diff --git a/docs/reference/overview.md b/docs/reference/overview.md index 561069df87..458dea4046 100644 --- a/docs/reference/overview.md +++ b/docs/reference/overview.md @@ -44,12 +44,6 @@ the `docker` daemon. Configures the path to the `ca.pem`, `cert.pem`, and `key.pem` files used for TLS verification. Defaults to `~/.docker`. -### COMPOSE\_MAX\_WORKERS - -Configures the maximum number of worker threads to be used when executing -commands in parallel. Only a subset of commands execute in parallel, `stop`, -`kill` and `rm`. - diff --git a/requirements.txt b/requirements.txt index dce583015b..fc5b68489c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,6 @@ PyYAML==3.10 docker-py==1.3.0 dockerpty==0.3.4 docopt==0.6.1 -futures==3.0.3 requests==2.6.1 six==1.7.3 texttable==0.8.2 diff --git a/setup.py b/setup.py index 6ce7da44c6..d0ec106798 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,6 @@ install_requires = [ 'docker-py >= 1.3.0, < 1.4', 'dockerpty >= 0.3.4, < 0.4', 'six >= 1.3.0, < 2', - 'futures >= 3.0.3', ]