[Stackless] Fwd: deepcopying (pickling) channels

Anselm Kruis a.kruis at science-computing.de
Mon Oct 7 19:50:34 CEST 2013


Hi Lars,

you are observing well known deficiencies of the pickle/cPickle 
implementation of Python. Perhaps 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 <lars at rational-it.com>
> Date: Thu, Oct 3, 2013 at 6:15 PM
> Subject: Re: [Stackless] deepcopying (pickling) channels
> To: The Stackless Python Mailing List <stackless at stackless.com>
>
>
> 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 <richard.m.tew at gmail.com> 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
>> Stackless at stackless.com
>> http://www.stackless.com/mailman/listinfo/stackless
>>
>
>
>
>
>
> maybe double but i got a mail bounce ..
>
> ---------- Forwarded message ----------
> From: *lars van Gemerden* <lars at rational-it.com
> <mailto:lars at rational-it.com>>
> Date: Thu, Oct 3, 2013 at 6:15 PM
> Subject: Re: [Stackless] deepcopying (pickling) channels
> To: The Stackless Python Mailing List <stackless at stackless.com
> <mailto:stackless at stackless.com>>
>
>
> 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 <richard.m.tew at gmail.com
> <mailto:richard.m.tew at gmail.com>> 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
>     Stackless at stackless.com <mailto:Stackless at stackless.com>
>     http://www.stackless.com/mailman/listinfo/stackless
>
>
>
>
> --
> ====================================
> Lars van Gemerden
> lars at rational-it.com <mailto:lars at rational-it.com>
> +31 6 26 88 55 39 <tel:%2B31%206%2026%2088%2055%2039>
> ====================================
>
>
>
> --
> ====================================
> Lars van Gemerden
> lars at rational-it.com <mailto:lars at rational-it.com>
> +31 6 26 88 55 39
> ====================================
>
>
> _______________________________________________
> Stackless mailing list
> Stackless at stackless.com
> http://www.stackless.com/mailman/listinfo/stackless
>

-- 
  Dipl. Phys. Anselm Kruis                       science + computing ag
  Senior Solution Architect                      Ingolstädter Str. 22
  email A.Kruis at science-computing.de             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




More information about the Stackless mailing list