Я пишу программу, в которой у меня есть объектно-ориентированный код, в котором я пытаюсь выполнять многопроцессорную обработку. Я получал ошибки рассола, потому что по умолчанию python может сериализовать функции, но не методы классов. Поэтому я использовал предложение Не могу pickle ‹введите 'instancemethod'› при использовании многопроцессорной функции Pool.map () в Python, но проблема в том, что если у меня есть лямбда-выражения внутри моих методов, это не работает. Мой пример кода выглядит следующим образом:
import numpy as np
from copy_reg import pickle
from types import MethodType
from multiprocessing.pool import ApplyResult
from _functools import partial
from _collections import defaultdict
class test(object):
def __init__(self,words):
self.words=words
# self.testLambda = defaultdict(lambda : 1.)
def parallel_function(self,f):
def easy_parallize(f,sequence):
from multiprocessing import Pool
pool = Pool(processes=50) # depends on available cores
result = pool.map(f, sequence) # for i in sequence: result[i] = f(i)
cleaned = [x for x in result if not x is None] # getting results
cleaned = np.asarray(cleaned)
pool.close() # not optimal! but easy
pool.join()
return cleaned
from functools import partial
return partial(easy_parallize, f)
def dummy(self):
self.t=defaultdict(lambda:1.)
def test(self,a,b,x):
print x
print a
return x*x
def testit(self):
sequence=[1,2,3,4,5]
f1=partial(self.test,'a','b')
f_p=self.parallel_function(f1)
results=f_p(sequence)
def _pickle_method(method):
func_name = method.im_func.__name__
obj = method.im_self
cls = method.im_class
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
if __name__ == "__main__":
pickle(MethodType, _pickle_method, _unpickle_method)
t=test('fdfs')
t.dummy()
t.testit()
Но я получаю следующую ошибку из-за лямбда-выражения:
Traceback (most recent call last):
File "/home/ngoyal/work/nlp_source/language-change/test.py", line 76, in <module>
t.testit()
File "/home/ngoyal/work/nlp_source/language-change/test.py", line 51, in testit
results=f_p(sequence)
File "/home/ngoyal/work/nlp_source/language-change/test.py", line 28, in easy_parallize
result = pool.map(f, sequence) # for i in sequence: result[i] = f(i)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Есть ли какой-нибудь простой способ решить эту проблему, не переходя к какой-либо другой упаковке, в которой используется укроп или что-то в этом роде? Можно ли это сделать с помощью обычных библиотек Python? (Я использую Python 2.7)