Настройка Dask работника с переменной - PullRequest
0 голосов
/ 30 января 2019

Я хотел бы распределить более крупный объект (или загрузить с диска), когда работник загружает и помещает его в глобальную переменную (например, calib_data).Это работает с работниками DASK?

1 Ответ

0 голосов
/ 31 января 2019

Похоже, клиентский метод register_worker_callbacks может делать то, что вы хотите в этом случае.Вам все еще понадобится где-то , чтобы поместить вашу переменную, поскольку в python нет действительно глобальной области видимости.Например, где-то может быть любой атрибут импортируемого модуля, к которому любой работник будет иметь доступ.Вы также можете добавить его в качестве атрибута самого рабочего экземпляра, но я не вижу очевидной причины хотеть сделать это.

Один способ, который работает, перехват случайным образом выбранного встроенного модуля;но я не особо рекомендую это (см. ниже)

def attach_var(name, value):
    import re
    re.__setattr__(name, value)

client.run(attach_var, 'x', 1)

def use_var():
    # any function running on a worker can do this, via delayed or
    # whatever method you pass with
    import re
    return re.x

client.run(use_var)

Прежде чем идти вперед, вы уже рассмотрели delayed(calib_data) или scatter, который скопирует вашу переменную туда, где она необходима, например,

futures = client.scatter(calib_data, broadcast=True)

или даже загрузку данных в рабочих с использованием обычной delayed семантики

dcalib = dask.delayed(load_calib_data)()
work = dask.delayed(process_stuff)(dataset1, dcalib)
...