Инициализация состояния работников, распределенных по даскам - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь сделать что-то вроде

resource = MyResource()
def fn(x):
   something = dosemthing(x, resource)
   return something

client = Client()
results = client.map(fn, data)

Проблема в том, что resource не сериализуемо и дорого построить.Поэтому я хотел бы построить его один раз для каждого работника и быть доступным для использования fn.

Как мне это сделать?Или есть какой-то другой способ сделать resource доступным для всех работников?

1 Ответ

0 голосов
/ 01 февраля 2019

Вы всегда можете создать ленивый ресурс, что-то вроде

class GiveAResource():
    resource = [None]
    def get_resource(self):
        if self.resource[0] is None:
            self.resource[0] = MyResource()
        return self.resource[0]

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

Этот класс лучше всего определить в модуле, а не в динамическом коде.

Здесь нет блокировки, поэтому, если несколько потоков запрашивают ресурс одновременно, когда он пока не нужен, вы получите избыточную работу.

...