<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-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;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></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-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>I apologize in advance &#8211; another question about Twisted and threading.&nbsp; I just seem to have trouble with this and I&#8217;m hoping my example is simple enough that a good explanation will be forthcoming.<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>I&#8217;m trying to start and stop Twisted in its own thread, over and over.&nbsp; I&#8217;ve seen some notes that say this is a bad idea and that programs that do so should be restructured.&nbsp; But, it would really work better for this application if I could do it somehow.<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>My controlling thread just wants to start Twisted, let it do its thing, and then let the thread stop.&nbsp; Later on, I&#8217;d like to do it again.&nbsp; In the example code below, the thread runs and stops fine in the first iteration.&nbsp; In the second iteration, it starts, seems to run okay, but it never stops.&nbsp; Is this an unreasonable request?<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal><span style='font-family:"Courier New"'>from threading import Thread<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>from twisted.internet import reactor<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>from twisted.internet import protocol<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>PORT = 9999<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>class AgentManager(Thread):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp; def run(self):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print '\nstarting agentmanager', self<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reactor.connectTCP('localhost', PORT, AgentClientFactory())<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reactor.listenTCP(PORT, AgentServerFactory())<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reactor.callLater(5, reactor.stop)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reactor.run(installSignalHandlers=0)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>class Producer(protocol.Protocol):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp; def connectionMade(self):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'connection made'<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.transport.write('Hello')<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;def connectionLost(self, reason):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'connection lost'<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>class Consumer(protocol.Protocol):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp; def dataReceived(self, data):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print data<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>class AgentServerFactory(protocol.ServerFactory):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp; protocol = Producer<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>class AgentClientFactory(protocol.ClientFactory):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp; protocol = Consumer<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>if __name__ == '__main__':<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp; for i in range(3):<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mgr = AgentManager()<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mgr.start()<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mgr.join()<o:p></o:p></span></p></div></body></html>