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

Вот код, который у меня есть на данный момент:

def f(tup):
    return some_complex_function(*tup)

def main():

    pool = Pool(processes=4) 
    #import and process data omitted 
    _args = [(x.some_func1, .05, x.some_func2) for x in list_of_some_class]
    results = pool.map(f, _args)
    print results

Первая ошибка, которую я получаю:

> Exception in thread Thread-2: Traceback (most recent call last):  
> File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
>     self.run()   File "/usr/lib/python2.7/threading.py", line 504, in run
>     self.__target(*self.__args, **self.__kwargs)   File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in
> _handle_tasks
>     put(task) PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

Любая помощь будет принята с благодарностью.

7
ast4 22 Янв 2013 в 21:40

2 ответа

Лучший ответ

Модуль multiprocess использует модуль pickle для сериализации аргументов, переданных функции (f), которая выполняется в другом процессе.

Многие из встроенных типов могут быть выбраны, но методы экземпляра не могут быть выбраны. Так что .05 в порядке, но x.some_func1 нет. См. Что можно мариновать и не мариновать? для более подробной информации.

Там нет простого решения. Вам нужно будет реструктурировать вашу программу, чтобы методы экземпляра не передавались в качестве аргументов (или избегайте использования multiprocess).

9
Jon-Eric 22 Янв 2013 в 17:57

Если вы используете ответвление multiprocessing с именем pathos.multiprocesssing, вы можете напрямую использовать классы и методы классов в многопроцессорных функциях map. Это потому, что dill используется вместо pickle или cPickle, и dill может сериализовать почти все в Python.

pathos.multiprocessing также предоставляет асинхронную функцию отображения… и может map функционировать с несколькими аргументами (например, map(math.pow, [1,2,3], [4,5,6]))

Увидеть: Что могут делать мультипроцессор и укроп вместе?

И: http://matthewrocklin.com/blog/work/2013 / 12 / 05 / Параллелизм - и - Сериализация /

>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> 
>>> p = Pool(4)
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> x = [0,1,2,3]
>>> y = [4,5,6,7]
>>> 
>>> p.map(add, x, y)
[4, 6, 8, 10]
>>> 
>>> class Test(object):
...   def plus(self, x, y): 
...     return x+y
... 
>>> t = Test()
>>> 
>>> p.map(Test.plus, [t]*4, x, y)
[4, 6, 8, 10]
>>> 
>>> p.map(t.plus, x, y)
[4, 6, 8, 10]

Получить код здесь: https://github.com/uqfoundation/pathos

3
Community 23 Май 2017 в 12:26