Потерпи меня, это очень специфическая установка; рассмотрим следующий код:
# 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
, но я бы хотел понять, почему это происходит и как упреждающее распознавание этой ситуации в будущем.