Использование dask с цитонизированными классами. Ошибка при травлении метода объекта

Я хотел бы цитонизировать модуль python следующим классом:

class C:
    def __init__(self, x):
        self.x = x

    @staticmethod
    def f(k):
        return k

    def g(self, k):
        return self.x, k

После установки cythonized модуля я пытаюсь выполнить код:

from dask import delayed, multiprocessing
c = C(3)
l = []
for i in range(10):
    l.append(delayed(c.f)(i))

results = delayed(l).compute(num_workers=2, get=multiprocessing.get)

У меня ошибка травления (то же самое для статического и нестатического метода):

~/anaconda/envs/cython_env/lib/python3.6/site-
packages/cloudpickle/cloudpickle.py in save_global(self, obj, name, 
pack)
    621             self.save_dynamic_class(obj)
    622         else:
--> 623             raise pickle.PicklingError("Can't pickle %r" % obj)
    624 
    625     dispatch[type] = save_global

PicklingError: Can't pickle <cyfunction C.f at 0x113582b10>

Почему это происходит?


person Vera Ilina    schedule 06.12.2017    source источник


Ответы (1)


Я предполагаю, что вам не следует использовать общий объект или переменные, если вы собираетесь использовать многопроцессорность. Вы можете использовать его с многопоточностью. В вашем случае проблема заключается в классе C. Вы передаете тот же объект c задержанному

person Naresh Kumar    schedule 20.12.2017