#python #multiprocessing #pickle
#питон #многопроцессорная обработка #соленый огурец
Вопрос:
Вообще говоря, у меня есть метод класса, который оформлен, и мне нужно, чтобы он был замаринован (на самом деле я использую multiprocessing
для вызова этой оформленной функции), но, как показано ниже, в коде есть ошибка с сообщением Can't pickle lt;function Test.test at 0x7f94b0156b80gt;: it's not the same object as __main__.Test.test
.
import pickle def dump(data, fpath, protocol=2): fdir = os.path.dirname(fpath) if not os.path.exists(fdir): os.makedirs(fdir) with open(fpath, 'wb') as f: pickle.dump(data, f) def D(f): def wrapper(self): dump(f, '/tmp/a.dump') return wrapper class Test(): @D def test(): print('test') aaa = Test() aaa.test()
Сообщение об ошибке:
PicklingError Traceback (most recent call last) /tmp/ipykernel_40891/4137513423.py in lt;modulegt; 16 print('test') 17 aaa = Test() ---gt; 18 aaa.test() /tmp/ipykernel_40891/4137513423.py in wrapper(self) 8 def D(f): 9 def wrapper(self): ---gt; 10 dump(f, '/tmp/a.dump') 11 return wrapper 12 /tmp/ipykernel_40891/4137513423.py in dump(data, fpath, protocol) 5 os.makedirs(fdir) 6 with open(fpath, 'wb') as f: ----gt; 7 pickle.dump(data, f) 8 def D(f): 9 def wrapper(self): PicklingError: Can't pickle lt;function Test.test at 0x7f94b0156b80gt;: it's not the same object as __main__.Test.test
Комментарии:
1. Сообщение об исключении довольно ясно говорит о том, что не работает в вашем примере. Короче говоря, функции маринуются по названию. Поэтому
Test.test
необходимо проверить, когда файл рассола будет перезагружен, если он больше не является исходной функцией (из-за декоратора), восстановление рассола не будет работать. Может быть, вам следует привести пример вашей проблемы с многопроцессорной обработкой? Это может иметь реальное решение. Ваш текущий пример кода на самом деле не может быть исправлен.