[Python-Dev] Multiprocessing module - Synergeticprocessing (my custom module) - Pickling unPickling issues

Dimitrios Pritsos dpritsos at extremepro.gr
Thu Dec 16 14:52:19 CET 2010


On 12/16/2010 02:29 PM, Michael Foord wrote:
> On 16/12/2010 11:09, Dimitrios Pritsos wrote:
>>
>> Hello Core Developers,
>>
>> My name is Dimitrios and I am newbie in python. I am working on a 
>> Project (part of my PhD) that is called Synergeticprocessing module. 
>> Initially is imitating the multiprocessing built in module but the 
>> processes are distributed on a LAN and not Locally. The main issue I 
>> have is with Pickle module. And I think I found some kind of BUG in 
>> the built in multiprocessing module.
>>
>
> Hello Dimitrios,
>
> Please post your bug report to the Python bug tracker. As you think 
> you have a fix for the issue it is much more likely to be applied 
> quickly if you can package it in the form of a test that demonstrates 
> the issue and a patch that fixes it.
>
> http://bugs.python.org/
>
> All the best,
>
> Michael Foord
>



Hello Michael,

OK I will do sent it to the bug tracker. But what about the last issue 
i.e. that even if the class is transfered-and-pickled-unpickled it 
raises an exception if the class is defined into the __main__ script and 
not imported from an other one. (see below) could you please guide me 
where should I post this for someone to help me fix it!

Best Regards,

Dimitrios




>
>
>> (Synergeticprocessing module is located at GitHub: 
>> https://github.com/dpritsos/synergeticprocessing)
>>
>> Starting with the "BUG". In case someone uses the 
>> multiprocessing.Pool of processes he/she has to face the problem of 
>> types.MehtodType Impossible pickling. That is you cannot dispatch an 
>> class instance method to the to the Process Pool. However, digging in 
>> to the Source Code of the module there are few lines that resolve 
>> this issue however are not activated or they are faultily activated 
>> so they do not work. This is the 'BUG'
>>
>> _@ ....../multiprocessing/forking.py_
>>
>>
>> .
>> .
>> .
>>
>> #
>> # Try making some callable types picklable
>> #
>>
>> from pickle import Pickler
>> class ForkingPickler(Pickler):
>>     dispatch = Pickler.dispatch.copy()
>>
>>     @classmethod
>>     def register(cls, type, reduce):
>>         def dispatcher(self, obj):
>>             rv = reduce(obj)
>>             self.save_reduce(obj=obj, *rv)
>>         cls.dispatch[type] = dispatcher
>>
>> def _reduce_method(m):
>>     if m.im_self is None:
>>         return getattr, (m.im_class, m.im_func.func_name)
>>     else:
>>         return getattr, (m.im_self, m.im_func.func_name)
>> ForkingPickler.register(type(ForkingPickler.save), _reduce_method)
>>
>> def _reduce_method_descriptor(m):
>>     return getattr, (m.__objclass__, m.__name__)
>> ForkingPickler.register(type(list.append), _reduce_method_descriptor)
>> ForkingPickler.register(type(int.__add__), _reduce_method_descriptor)
>>
>> #def _reduce_builtin_function_or_method(m):
>> #    return getattr, (m.__self__, m.__name__)
>> #ForkingPickler.register(type(list().append), 
>> _reduce_builtin_function_or_method)
>> #ForkingPickler.register(type(int().__add__), 
>> _reduce_builtin_function_or_method)
>> .
>> .
>> .
>>
>> The RED lines are not doing the job, for some reason they are not 
>> managing to register the GREEN function as a global reduce/pickling 
>> function even if you call the registration function into you __main__ 
>> script.
>>
>> The solution I found is just to do this
>> *
>> import copy_reg
>> import types*
>>
>> def _reduce_method(m):
>>     if m.im_self is None:
>>         return getattr, (m.im_class, m.im_func.func_name)
>>     else:
>>         return getattr, (m.im_self, m.im_func.func_name)
>>
>> *copy_reg.pickle(types.MethodType, _reduce_method)*
>> .
>> .
>> .
>>
>> Doing that everything works FINE. But ONLY for local methods i.e. the 
>> ones that their class is defined on the __main__ script or other 
>> import-ed.
>>
>> In case you want to send something remotely (in an other machine) or 
>> to an other __main__ script running separately then you get a message 
>> like this:
>>
>> 'module' object has no attribute '<my_class>'
>>
>> The only way to resolve this is firstly to import a script that has 
>> <my_class> defined there and everything works fine.
>>
>> SO the problems it seems to be that the *m.im_class*  (look code 
>> above) has some attribute __module__ defined as __module__ = 
>> '__main__' or something like that. And this is the reason why remote 
>> script cannot execute the function. I mean that the _reduce_method() 
>> above DOES is pickling the whole CLASS object so there is no reason 
>> not to be executed at the remote script. Besides it does as mentioned 
>> above in you just import this the user defined class form an other 
>> script.
>>
>>
>> I have already spent about 12 weeks working on building my 
>> synergeticPool and resolve the issue of Pickling and only 2 days 
>> needed for the code of the Pool and the rest of the time was spent 
>> for the Pickling issues, and study all the Class related mechanics of 
>> python. That was the reason I ve started digging the 
>> multipocessessing module and found this say 'BUG', and finally sent 
>> this email.
>>
>> Best Regards,
>>
>>
>> Dimitrios
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Python-Dev mailing list
>> Python-Dev at python.org
>> http://mail.python.org/mailman/listinfo/python-dev
>> Unsubscribe:http://mail.python.org/mailman/options/python-dev/fuzzyman%40voidspace.org.uk
>
>
> -- 
>
> http://www.voidspace.org.uk/
>
> May you do good and not evil
> May you find forgiveness for yourself and forgive others
> May you share freely, never taking more than you give.
> -- the sqlite blessinghttp://www.sqlite.org/different.html

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20101216/b5fc7d38/attachment.html>


More information about the Python-Dev mailing list