I am reasonably familiar with pickle (e.g. i know you cant pickle most functions), but this is pretty stackless specific: why can i pickle an empty channel, but not a sending/receiving channel?
Cheers, Lars On Mon, Oct 7, 2013 at 7:50 PM, Anselm Kruis <[email protected]>wrote: > Hi Lars, > > you are observing well known deficiencies of the pickle/cPickle > implementation of Python. Perhaps sPickle (http://pypi.python.org/pypi/** > sPickle <http://pypi.python.org/pypi/sPickle>) can pickle the channels. > > Regards > Anselm > > > Am 06.10.2013 08:58, schrieb lars van Gemerden: > >> maybe double but i got a mail bounce .. >> >> ---------- Forwarded message ---------- >> From: lars van Gemerden <[email protected]> >> Date: Thu, Oct 3, 2013 at 6:15 PM >> Subject: Re: [Stackless] deepcopying (pickling) channels >> To: The Stackless Python Mailing List <[email protected]> >> >> >> actually both give an error. The only thing different is the error >> message. >> with pickle the code would be: >> >> ------------------------------**------------------------------** >> --------------- >> import stackless, pickle >> >> class Test(object): >> def __init__(self): >> self.channel = stackless.channel() >> >> def run(self): >> stackless.tasklet(self.sender)**() >> stackless.tasklet(self.**receiver)() >> stackless.run() >> >> def sender(self): >> counter = 0 >> while counter < 10: >> self.channel.send(counter) >> counter += 1 >> >> def receiver(self): >> counter = 0 >> while counter < 12: >> counter = self.channel.receive() >> print counter, >> print "done" >> >> if __name__ == "__main__": >> >> t = Test() >> t.run() >> t.channel = None >> s = pickle.dumps(t) #OK >> >> t = Test() >> t.run() >> s = pickle.dumps(t) #ERROR >> ------------------------------**------------------------------** >> ----------------- >> and the error: >> >> pickle.PicklingError: Can't pickle <type 'function'>: it's not found as >> __builtin__.function >> >> otherwise the error behavior is the same as decribed above. >> >> Cheers, Lars >> >> (as far as i have read and tested a bit, deepcopy allows more to be copied >> then pickle, but cPickle is faster, so i have my own deepcopy: >> >> def deepcopy(obj): >> try: >> return cPickle.loads(cPickle.dumps(**obj, -1)) >> except PicklingError: >> return copy.deepcopy(obj) >> ) >> >> >> On Thu, Oct 3, 2013 at 5:19 AM, Richard Tew <[email protected]> >> wrote: >> >> I'm a little confused. Are you pickling the tasklets, or copying >>> them? These are different things to Python. >>> >>> As far as I know using copy or deepcopy has never been supported for >>> tasklets and therefore channels. >>> >>> Pickling however, is another matter. >>> >>> Cheers, >>> Richard. >>> >>> ______________________________**_________________ >>> Stackless mailing list >>> [email protected] >>> http://www.stackless.com/**mailman/listinfo/stackless<http://www.stackless.com/mailman/listinfo/stackless> >>> >>> >> >> >> >> >> maybe double but i got a mail bounce .. >> >> ---------- Forwarded message ---------- >> From: *lars van Gemerden* <[email protected] >> <mailto:[email protected]>> >> Date: Thu, Oct 3, 2013 at 6:15 PM >> Subject: Re: [Stackless] deepcopying (pickling) channels >> To: The Stackless Python Mailing List <[email protected] >> <mailto:stackless@stackless.**com <[email protected]>>> >> >> >> actually both give an error. The only thing different is the error >> message. with pickle the code would be: >> >> ------------------------------**------------------------------** >> --------------- >> import stackless, pickle >> >> class Test(object): >> def __init__(self): >> self.channel = stackless.channel() >> def run(self): >> stackless.tasklet(self.sender)**() >> stackless.tasklet(self.**receiver)() >> stackless.run() >> def sender(self): >> counter = 0 >> while counter < 10: >> self.channel.send(counter) >> counter += 1 >> def receiver(self): >> counter = 0 >> while counter < 12: >> counter = self.channel.receive() >> print counter, >> print "done" >> if __name__ == "__main__": >> t = Test() >> t.run() >> t.channel = None >> s = pickle.dumps(t) #OK >> t = Test() >> t.run() >> s = pickle.dumps(t) #ERROR >> ------------------------------**------------------------------** >> ----------------- >> and the error: >> >> pickle.PicklingError: Can't pickle <type 'function'>: it's not found as >> __builtin__.function >> >> otherwise the error behavior is the same as decribed above. >> >> Cheers, Lars >> >> (as far as i have read and tested a bit, deepcopy allows more to be >> copied then pickle, but cPickle is faster, so i have my own deepcopy: >> >> def deepcopy(obj): >> try: >> return cPickle.loads(cPickle.dumps(**obj, -1)) >> except PicklingError: >> return copy.deepcopy(obj) >> ) >> >> >> On Thu, Oct 3, 2013 at 5:19 AM, Richard Tew <[email protected] >> <mailto:richard.m.tew@gmail.**com <[email protected]>>> wrote: >> >> I'm a little confused. Are you pickling the tasklets, or copying >> them? These are different things to Python. >> >> As far as I know using copy or deepcopy has never been supported for >> tasklets and therefore channels. >> >> Pickling however, is another matter. >> >> Cheers, >> Richard. >> >> ______________________________**_________________ >> Stackless mailing list >> [email protected] >> <mailto:Stackless@stackless.**com<[email protected]> >> > >> >> >> http://www.stackless.com/**mailman/listinfo/stackless<http://www.stackless.com/mailman/listinfo/stackless> >> >> >> >> >> -- >> ==============================**====== >> Lars van Gemerden >> [email protected] <mailto:[email protected]> >> +31 6 26 88 55 39 <tel:%2B31%206%2026%2088%2055%**2039> >> >> ==============================**====== >> >> >> >> -- >> ==============================**====== >> Lars van Gemerden >> [email protected] <mailto:[email protected]> >> >> +31 6 26 88 55 39 >> ==============================**====== >> >> >> ______________________________**_________________ >> Stackless mailing list >> [email protected] >> http://www.stackless.com/**mailman/listinfo/stackless<http://www.stackless.com/mailman/listinfo/stackless> >> >> > -- > Dipl. Phys. Anselm Kruis science + computing ag > Senior Solution Architect Ingolstädter Str. 22 > email [email protected] 80807 München, Germany > phone +49 89 356386 874 fax 737 www.science-computing.de > -- > Vorstandsvorsitzender/Chairman of the board of management: > Gerd-Lothar Leonhart > Vorstand/Board of Management: > Dr. Bernd Finkbeiner, Michael Heinrichs, Dr. Arno Steitz, Dr. Ingrid Zech > Vorsitzender des Aufsichtsrats/ > Chairman of the Supervisory Board: > Philippe Miltin > Sitz/Registered Office: Tuebingen > Registergericht/Registration Court: Stuttgart > Registernummer/Commercial Register No.: HRB 382196 > > > > ______________________________**_________________ > Stackless mailing list > [email protected] > http://www.stackless.com/**mailman/listinfo/stackless<http://www.stackless.com/mailman/listinfo/stackless> > -- ==================================== Lars van Gemerden [email protected] +31 6 26 88 55 39 ====================================
_______________________________________________ Stackless mailing list [email protected] http://www.stackless.com/mailman/listinfo/stackless
