<div dir="ltr"><div>Thanks you for the clear explanation, i never really thought about how debuggers work. I am working on a proof of concept/demo for a way to graphically (drag and drop) design a web application (database design, process flow/application layer design, role model design). and the application layer uses stackless to communicate between process steps (push and pull) and with the webserver. This basically works, and at this point i am debugging and simplifying to ensure minimal surprises during demos. Also i want to get a better understanding of stackless to be able to work with mutiple threads, multiprocessing or multiple machines for later production versions. At that point i might actually need to pickle tasklets (e.g. i have objects that propagate through the process to for example to gather and report information).</div>
<div><br></div><div>Because the program is pretty complex, reducing book keeping is a priority, so i was also checking whether i could avoid book keeping on the channels (or tasklets), but setting channels to None at the end of a run was straightforward.</div>
<div><br></div><div>The blocked channels remain because before, i started up and killed the web application server from the design gui. Killing the app server via TaskletExit's leaves some channels blocked, but since this is all for demos i don't care, which made it impossible (in wing) to save my models to file. I have changed my approach in that i now make a deep copy of all the relevant objects before each run and run it in a separate thread, so (i realize now) the problem should be gone. The objects in the running app server are no longer needed after the run.</div>
<div><br></div><div>Anyway, hope this is somewhat interesting,</div><div><br></div><div>thanks again, Lars</div><div><br></div><div>BTW: before it started including a webserver in the app server, due to stackless, i could change a running process on the flight via my design gui, which would indeed change the execution accordingly. I was very impressed :-). I can probably achieve that again by putting a schedule() in the serve_forever loop of the webserver. Hmm, this gives me ideas ... </div>
<div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Oct 12, 2013 at 4:08 PM, Kristján Valur Jónsson <span dir="ltr"><<a href="mailto:kristjan@ccpgames.com" target="_blank">kristjan@ccpgames.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-GB" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Let me try to explain:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">This has nothing to do with channels.  Stackless extends python by allowing execution frames to be pickled.<u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">You can pickle a tasklet that is paused.  When you pickle a channel with a tasklet sleeping on it, the tasklet is also pickled.  So, stop thinking about channels,
 think execution frames.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">For execution frames to be picklable, certain restrictions are in effect.  For example, the tasklet running it can only be pure python (no C state, etc.). 
 This is however, not the case here.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Everything else in a frame must be pickleable.  a ‘frame’ is the stack frame of your program.  It contains local variables, function arguments, and so on.<u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">If anything on that frame is not-pickleable, then the frame as a whole is not picklable.<u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Python debuggers work by setting a callback hook to sys.settrace.  The function in there is called for every code line. 
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I don’t know the exact details of how the wingware debugger works, but apparently it has inserted an extra execution frame for the tasklet, and, this frame
 contains an unpickleable object.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Wingware were probably not aware that execution frames ought to be pickleable.  Also, the debugger is an active “state” for the program.  pickling a running
 function under a debugger, does that not mean that you pickle the debugger state as well?<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Anyway, we can probably approach them and explain the problem to them.  I could ask them for details of the module in question.  Maybe this is fixable.  But
 let’s be clear that it is not a Stackless problem:  An object in an execution frame over which we have no problem, (an frame inserted into your program by your actively running debugger) is not pickleable.
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">By the way, I don’t quite understand your problem.  If it can be solved by just setting channel=None, then it means that you really have no interest in the
 channel, or don’t want to unpickle it again and continue sending to it.  And as such, leaving a blocked tasklet on the channel to me looks like a bug in your program.  If you really had no intention to unpickle this channel and continue to send to its blocked
 (and pickled-unpickled) tasklet, then you shouldn’t be pickling it in the first place
</span><span style="font-size:11.0pt;font-family:Wingdings;color:#1f497d">J</span><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">K<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> <a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a> [mailto:<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a>]
<b>On Behalf Of </b>lars van Gemerden<br>
<b>Sent:</b> 11. október 2013 18:33</span></p><div><div class="h5"><br>
<b>To:</b> The Stackless Python Mailing List<br>
<b>Subject:</b> Re: [Stackless] Fwd: deepcopying (pickling) channels<u></u><u></u></div></div><p></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">So i can pickle tasklets/channels, but then i cannot debug my program ;-)<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I don't know how debuggers work, but it seems still odd that channels that are sending/wating to receive cannot be pickled, but empty channels can (if you let the loops in the little demo end at the same count the object can be pickled
 in wing).<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Is there an easy way to clear a channel that is sending/waiting?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Anyway, for now i just set create all channels before starting stackless.run and set them to None afterwards.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Cheers, Lars<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Fri, Oct 11, 2013 at 5:44 PM, Kristján Valur Jónsson <<a href="mailto:kristjan@ccpgames.com" target="_blank">kristjan@ccpgames.com</a>> wrote:<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Ok, this makes sense.  What you are seeing is the failure to pickle inaccessible functions inside
 the wingware debugger.  It is the debug callback frame that is failing, and this frame contains local variables, including “has_key” that point to anonymous functions.  Anonymous functions cannot (currently) be pickled, since all functions are (currently)
 pikled by name.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I suppose we _<i>could</i>_ add function recreation (i.e. pickle the code objects) in such cases….</span><u></u><u></u></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">But anyway, the reason you are failing is because you are running inside the debugger
</span><span style="font-size:11.0pt;font-family:Wingdings;color:#1f497d">J</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">K</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a> [mailto:<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a>]
<b>On Behalf Of </b>Kristján Valur Jónsson<br>
<b>Sent:</b> 11. október 2013 14:48</span><u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><br>
<b>To:</b> The Stackless Python Mailing List<br>
<b>Subject:</b> Re: [Stackless] Fwd: deepcopying (pickling) channels<u></u><u></u></p>
</div>
</div>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Ok, running this in the wingware debugger, I see this is happening because it is trying to pickle
 the debugging frame!</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I need to investigate more what Is happening, but functions cannot be pickled if they are not accessible
 by name, and some of the debugging code internal functions might be anonymous.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Stackless can pickle frames and functions, as long as those functions are pickleable by name, IIRC.</span><u></u><u></u></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">K</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a> [<a href="mailto:stackless-bounces@stackless.com" target="_blank">mailto:stackless-bounces@stackless.com</a>]
<b>On Behalf Of </b>Kristján Valur Jónsson<br>
<b>Sent:</b> 11. október 2013 11:21<br>
<b>To:</b> The Stackless Python Mailing List<br>
<b>Subject:</b> Re: [Stackless] Fwd: deepcopying (pickling) channels</span><u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">“I run this with the default settings in wing IDE. If i run it in IDLE, there is no exception.”<u></u><u></u></p>
<p class="MsoNormal">That sounds like the problem.<u></u><u></u></p>
<p class="MsoNormal">Boy, do I hate how hard it is to debug pickling problems.  for “pickle” we really should have a flag that prints out the hierarchy as it is pickling.<u></u><u></u></p>
<p class="MsoNormal">Maybe someone has already done that?<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Anyway, I’ll install Wingware and see if I can reproduce it there.  I’m sure wingware is messing with pickling in some unexpected way.<u></u><u></u></p>
<p class="MsoNormal">(I’m unfamiliar with wingware, btw.   If you feel up to it, try putting debugging code inside pickle.py to dump out what it is doing, that might be faster.  I would guess that it
 is doing something with  the copy_reg module and this is messing with our function pickling.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">K<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a> [<a href="mailto:stackless-bounces@stackless.com" target="_blank">mailto:stackless-bounces@stackless.com</a>]
<b>On Behalf Of </b>lars van Gemerden<br>
<b>Sent:</b> 10. október 2013 15:24<br>
<b>To:</b> The Stackless Python Mailing List<br>
<b>Subject:</b> Re: [Stackless] Fwd: deepcopying (pickling) channels</span><u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">the callstack is:<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">pickle.PicklingError: Can't pickle <type 'function'>: it's not found as __builtin__.function<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "d:\Documents\Code\python\floware\toolshed\tests\stackless_test.py", line 34, in <module><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  print pickle.dumps(t) #ERROR<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 1411, in dumps<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  Pickler(file, protocol).dump(obj)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 231, in dump<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self.save(obj)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 338, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self.save_reduce(obj=obj, *rv)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 426, in save_reduce<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(state)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 661, in save_dict<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self._batch_setitems(obj.iteritems())<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(v)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 338, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self.save_reduce(obj=obj, *rv)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 426, in save_reduce<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(state)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 569, in save_tuple<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(element)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 607, in save_list<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self._batch_appends(iter(obj))<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 622, in _batch_appends<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(x)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 338, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self.save_reduce(obj=obj, *rv)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 426, in save_reduce<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(state)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 569, in save_tuple<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(element)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 607, in save_list<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self._batch_appends(iter(obj))<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 622, in _batch_appends<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(x)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 338, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self.save_reduce(obj=obj, *rv)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 426, in save_reduce<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(state)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 569, in save_tuple<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(element)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 661, in save_dict<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self._batch_setitems(obj.iteritems())<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(v)                                                                               <== THIS LINE<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 802, in save_function<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  return self.save_reduce(obj=obj, *rv)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 426, in save_reduce<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(state)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 569, in save_tuple<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(element)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 661, in save_dict<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self._batch_setitems(obj.iteritems())<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(v)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 338, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self.save_reduce(obj=obj, *rv)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 426, in save_reduce<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(state)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 661, in save_dict<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  self._batch_setitems(obj.iteritems())<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 675, in _batch_setitems<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  save(v)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 293, in save<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  f(self, obj) # Call unbound method with explicit self<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">File "C:\Python27\lib\pickle.py", line 760, in save_global<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  (obj, module, name))<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Probably not that usefull without values ... in THIS LINE above,  v is module C:\python27\lib\new.pyc.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I don't think there is a framework in place that would influence this script, the imports (pickle, stackless) are unaltered.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I run this with the default settings in wing IDE. If i run it in IDLE, there is no exception.<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Thu, Oct 10, 2013 at 3:22 PM, Kristján Valur Jónsson <<a href="mailto:kristjan@ccpgames.com" target="_blank">kristjan@ccpgames.com</a>> wrote:<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">The error is weird.  It seems to be trying to pickle the “function” type.  It shouldn’t try doing
 that.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Now, I know that pickling channels with tasklets on them works.  This is what stackless does.</span><u></u><u></u></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I tried saving your code into a module and just running it from the command line.</span><u></u><u></u></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I wonder if there is some copy_reg magic that is interfering with the code.  How are you running
 it?  Is this when running the code as a module, or when typing it in from the console?</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Are you trying this in a stand-alone environment or in some application framework?</span><u></u><u></u></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Finally, can I see the full traceback for the pickle exception.  If you are using pickle (and not
 cPickle) a traceback can help us find out why it is failing.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">K</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"> </span><u></u><u></u></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a> [mailto:<a href="mailto:stackless-bounces@stackless.com" target="_blank">stackless-bounces@stackless.com</a>]
<b>On Behalf Of </b>lars van Gemerden<br>
<b>Sent:</b> 9. október 2013 12:48</span><u></u><u></u></p>
<div>
<p class="MsoNormal"><br>
<b>To:</b> The Stackless Python Mailing List<u></u><u></u></p>
</div>
<p class="MsoNormal"><b>Subject:</b> Re: [Stackless] Fwd: deepcopying (pickling) channels<u></u><u></u></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">Hi Kristjan,<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">the version i am using is: python 2.7.5 Stackless 3.1b3 (from binary).<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I think the stackless mailsystem was a little off, i tried with pickle.dumps (see mail history below), with the error: <span style="font-size:10.0pt;font-family:"Arial","sans-serif"">pickle.PicklingError:
 Can't pickle <type 'function'>: it's not found as __builtin__.function.</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial","sans-serif"">"</span><span style="font-size:11.5pt;font-family:"Calibri","sans-serif";color:#1f497d">stackless.run() returns when
 there are no <i>runnable</i> tasklets ...", ok, clear, thanks.</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.5pt;font-family:"Calibri","sans-serif";color:#1f497d">Cheers, Lars</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Wed, Oct 9, 2013 at 2:36 PM, lars van Gemerden <<a href="mailto:lars@rational-it.com" target="_blank">lars@rational-it.com</a>> wrote:<u></u><u></u></p>
<div>
<p class="MsoNormal">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?<u></u><u></u></p>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Cheers, Lars<u></u><u></u></p>
</div>
</div>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Mon, Oct 7, 2013 at 7:50 PM, Anselm Kruis <<a href="mailto:a.kruis@science-computing.de" target="_blank">a.kruis@science-computing.de</a>> wrote:<u></u><u></u></p>
<p class="MsoNormal">Hi Lars,<br>
<br>
you are observing well known deficiencies of the pickle/cPickle implementation of Python. Perhaps sPickle (<a href="http://pypi.python.org/pypi/sPickle" target="_blank">http://pypi.python.org/pypi/sPickle</a>) can pickle the channels.<br>

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

<br>_______________________________________________<br>
Stackless mailing list<br>
<a href="mailto:Stackless@stackless.com">Stackless@stackless.com</a><br>
<a href="http://www.stackless.com/mailman/listinfo/stackless" target="_blank">http://www.stackless.com/mailman/listinfo/stackless</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br>====================================<br>
Lars van Gemerden<br><a href="mailto:lars@rational-it.com">lars@rational-it.com</a><br>+31 6 26 88 55 39<br>====================================
</div>