Почему `dask.distributed` не распараллеливает первый запуск моего рабочего процесса? - PullRequest
0 голосов
/ 31 августа 2018

Потерпи меня, это очень специфическая установка; рассмотрим следующий код:

# sys.version = 3.6.6
# distributed.__version__ = 1.22.0

import subprocess
from distributed import Client
from time import sleep

def start():
    subprocess.check_output(['bash', '-c', 'ls'])

class Container:
    def __init__(self, fn):
        self.fn = fn
    def run(self, *args, **kwargs):
        return self.fn(*args, **kwargs)

%%time
with Client(processes=True) as client:
    f = client.submit(Container(start).run, pure=False)
    a = client.submit(Container(lambda x: sleep(5)).run, f, pure=False)
    b = client.submit(Container(lambda x: sleep(5)).run, f, pure=False)
    res = client.gather([a, b])
# Wall time: 10.7 s

Я провел еще несколько более сложных тестов и по какой-то причине distributed не вычисляет a и b параллельно. Однако это очень , характерное для текущей настройки:

  • работает как положено, если processes=False
  • работает как положено, если функции передаются напрямую
  • это работает, как и ожидалось, если я оставлю Client в живых и отправлю этот же график во второй раз (так что должен произойти некоторый прогрев)

Это должно быть что-то , связанное с тем, как Container маринован, и с тем фактом, что я раскручиваю новый subprocess, но я бы хотел понять, почему это происходит и как упреждающее распознавание этой ситуации в будущем.

...