Дублирует ли joblib экземпляры класса, переданные в качестве аргументов функции? - PullRequest
0 голосов
/ 16 июня 2020

Я использую joblib для параллельного запуска некоторых симуляций (для MWE см. Мой ответ на этот вопрос). Симулятор - это экземпляр класса, который вызывается на каждом этапе с внешним действием. Если я запускаю 4 симулятора, мне нужно 4 разных независимых симулятора. Однако мой вызов joblib выглядит примерно так:

simulator = Simulator(...)
results = Parallel(n_jobs=4)([delayed(run_simulation)(simulator) for i in range(4)])

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

Я ответил на свой вопрос, хотя я не уверен в ответе. Приветствуются любые дальнейшие идеи.

1 Ответ

0 голосов
/ 16 июня 2020

Этот MWE проблемы, описанной в вопросе, по-видимому, предполагает, что он имеет

from joblib import Parallel, delayed

class A:
    def __init__(self):
        self.c = 1

    def call(self, a):
        self.c += a

    def get(self):
        return self.c

a = A()

def call_a(inst):
    inst.call(1)
    return inst.get()

result = Parallel(n_jobs=4)([delayed(call_a)(a) for i in range(10)])

При запуске вы получаете

In [2]: result
Out[2]: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]

Если экземпляр a был совместно использован , вы получили бы числа от 2 до 11.

...