<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1047140188;
        mso-list-type:hybrid;
        mso-list-template-ids:2093284528 -1932724266 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0D8;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi, I just tried reproducing this with the current stackless 2.7 and it just works.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">What stackless are you using<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">One of the points of stackless is that it can copy/pickle modules just fine.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">instead of copy, deepcopy, can you try:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">import pickle<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">print pickle.dumps(t)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">and see if this succeeds?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-family:Wingdings"><span style="mso-list:Ignore">Ř<span style="font:7.0pt "Times New Roman""> 
</span></span></span><![endif]>Probably a lack in my basic understanding of stackless: why is the line  t.channel = None reached if one of the tasklets is still waiting on a channel?<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">stackless.run() returns when there are no
<i>runnable</i> tasklets.  One tasklet is blocked, the other is spent.  So, stackless.run returns.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">K<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></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""> stackless-bounces@stackless.com [mailto:stackless-bounces@stackless.com]
<b>On Behalf Of </b>lars van Gemerden<br>
<b>Sent:</b> 2. október 2013 09:47<br>
<b>To:</b> stackless@stackless.com<br>
<b>Subject:</b> [Stackless] deepcopying (pickling) channels<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi all,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I am getting a strange (for me) exception when i try to deepcopy/pickle channels that are still sending or receiving, as in:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">--------------------------------------------------------------------------------------<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">import stackless, copy<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">class Test(object):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def __init__(self):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        self.channel = stackless.channel()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def run(self):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        stackless.tasklet(self.sender)()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        stackless.tasklet(self.receiver)()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        stackless.run()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def sender(self):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        counter = 0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        while counter < 10:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            self.channel.send(counter)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            counter += 1<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def receiver(self):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        counter = 0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        while counter < 12:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            counter = self.channel.receive()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            print counter,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        print "done"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if __name__ == "__main__":<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    t = Test()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    t.run()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    t.channel = None <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    t = copy.deepcopy(t) #OK<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    t = Test()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    t.run()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    t = copy.deepcopy(t) #ERROR<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal">----------------------------------------------------------------------------------------------<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">the error is:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">TypeError: object.__new__(NotImplementedType) is not safe, use NotImplementedType.__new__()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">somewhere deep into deepcopy, after reading some forums, i think it's trying to copy a module.<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">----------------------------------------------------------------------------------------------<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Probably a lack in my basic understanding of stackless: why is the line  t.channel = None reached if one of the tasklets is still waiting on a channel?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Anyway,in this case the receiver tasklet is still waiting while the sender is done, but it also happens if the receiever is done before the sender (e.g. change 12 to 8). There is no error if both are done at the same time (change 12 to
 10).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Can someone explain this to me? Is it unavoidable or can it somehow be fixed. Otherwise i would probably need to clean up all channels after a stackless run is finished and create them before a run starts or do something similar in in __getstate__/__setstate__.
 I use the ??? pattern to allow external interuption the stackless run:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">----------------------------------------------------------------------------------------------<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">class OpenTasklets(Tasklets):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    stop = False<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    @classmethod<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def run(cls, maxcount = None):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        cls.schedule_channel = stackless.channel()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        cls.schedule_channel.preference = 1<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        counter = 0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        while stackless.getruncount() != 1:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            stackless.run()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            cls.reschedule(cls.stop or (maxcount and counter > maxcount))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            counter += 1<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">      <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    @classmethod<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def schedule(cls):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        if cls.schedule_channel.receive():<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            raise TaskletExit<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    @classmethod<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def reschedule(cls, stop = False):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        while cls.schedule_channel.balance < 0:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            cls.schedule_channel.send(stop)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">            <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    @classmethod<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">    def tasklet(cls, func):<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        return stackless.tasklet(func)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">----------------------------------------------------------------------------------------------<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">  <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Cheers, Lars<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">-- <o:p></o:p></p>
</div>
<p class="MsoNormal">====================================<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>
==================================== <o:p></o:p></p>
</div>
</div>
</div>
</div>
</body>
</html>