Вот список того, что можно мариновать .В частности, функции можно выбирать только в том случае, если они определены на верхнем уровне модуля.
Этот фрагмент кода:
import multiprocessing as mp
class Foo():
@staticmethod
def work(self):
pass
if __name__ == '__main__':
pool = mp.Pool()
foo = Foo()
pool.apply_async(foo.work)
pool.close()
pool.join()
выдает ошибку, почти идентичную той, которую вы опубликовали:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 315, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Проблема в том, что все методы pool
используют queue.Queue
для передачи задач рабочим процессам.Все, что проходит через queue.Queue
, должно быть доступно для выбора, а foo.work
не может быть выбрано, поскольку оно не определено на верхнем уровне модуля.
Это можно исправить, определив функцию на верхнем уровне, который вызывает foo.work()
:
def work(foo):
foo.work()
pool.apply_async(work,args=(foo,))
Обратите внимание, что foo
выбирается, так как Foo
определяется на верхнем уровне, а foo.__dict__
выбирается.