2017-02-23 40 views
2

У меня есть функция, чтобы сделать вычисление, здесь просто один в качестве примера,Даска используя отсроченной для построения списка функций, но указать номер процесса использовать

def add(a,b): 
    return a+b 

И тогда я выполнить эту функцию 100 раз смущающе параллельным образом,

output = [delayed(add)(i,i+1) for i in range(100)] 
compute(*output) 

Мой вопрос - это приведенный выше код начнет процесс 100? Если да, есть ли способ заставить его начать говорить о 10 процессах, чтобы сократить время начала процесса?

ответ

2

По умолчанию get для dask delayed является пулом потоков с таким количеством потоков, как у вас есть ядра.

Вы можете использовать другой get (а не резьбовой), а также указать параметры get через compute. Чтобы использовать пул потоков с 10 потоками, вы можете сделать dask.compute(*output, num_workers=10). Чтобы использовать модуль multiprocessing на базе 10 сотрудников, вы можете сделать dask.compute(*output, get=dask.multiprocessing.get, num_workers=10). (Обратите внимание, что модуль многопроцессорности, на котором основан dask.multiprocessing, не является самым большим камнем в stdlib. Использование Dask, вероятно, является редким, которое должно работать в основном, если вы используете его по-настоящему обычным способом, но если мне понадобится процесс параллелизм с dask, я бы быстро использовал Distributed, даже на одном хосте.)

2

Планировщики по умолчанию запускают пулы потоков или пулы процессов с таким же количеством потоков/процессов, как у вас на вашем компьютере есть логические ядра (хотя это настраивается). Dask не будет раскручивать столько процессов, сколько у вас есть задачи; как вы полагаете, это было бы очень неэффективно.

Подробнее о планировщиках Dask вы можете узнать по адресу this doc page.