Hi
<div><br></div><div>I have a series of MultiService objects, with child Services. Some of these services are TCPServers, for example, and others are my own objects (extending from Service).</div><div>In the instance that I have a Service which controls a LoopingCall, I am getting intermittent &#39;unclean reactor&#39; errors during tests. I feel I might be missing some handling of deferreds, perhaps.</div>
<div>(using 8.2.0 - looking to migrate to 10.2.0 soon)</div><div><br></div><div>Here is an example of the approach being used:</div><div><br></div><div>class AdapterQueue(service.MultiService):</div><div><div>    def startService(self):</div>
<div>        service.Service.startService(self)</div><div>        self._looping_controller = LoopingCall(self._action)</div><div>        d = self._looping_controller.start(self.delay, False)</div><div>        d.addErrback(self._errorInScheduler)</div>
</div><div><br></div><div><div>    def stopService(self):</div><div>        service.Service.stopService(self)</div><div>        d = self._looping_controller.deferred</div><div>        self._looping_controller.stop()</div>
<div>        return d</div></div><div><br></div><div>And an example error (happens about 1/3 of the time):</div><div><br></div><div><div>DirtyReactorAggregateError: Reactor was unclean.</div><div>DelayedCalls: (set twisted.internet.base.DelayedCall.debug = True to debug)</div>
<div>&lt;DelayedCall 30800112 [0.0189974308014s] called=0 cancelled=0 LoopingCall&lt;0.033333333333333333&gt;(AdapterQueue._action, *(), **{})()</div><div><br></div><div>traceback at creation: </div><div><br></div><div>  File &quot;C:\Python26\lib\threading.py&quot;, line 497, in __bootstrap</div>
<div>    self.__bootstrap_inner()</div><div>      File &quot;C:\Python26\lib\threading.py&quot;, line 525, in __bootstrap_inner</div><div>    self.run()</div><div>      File &quot;C:\Python26\lib\threading.py&quot;, line 477, in run</div>
<div>    self.__target(*self.__args, **self.__kwargs)</div><div>      File &quot;D:\dev\eggs\nose-0.11.3-py2.6.egg\nose\twistedtools.py&quot;, line 57, in &lt;lambda&gt;</div><div>    installSignalHandlers=False))</div><div>
      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\base.py&quot;, line 1128, in run</div><div>    self.mainLoop()</div><div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\base.py&quot;, line 1137, in mainLoop</div>
<div>    self.runUntilCurrent()</div><div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\base.py&quot;, line 757, in runUntilCurrent</div><div>    call.func(*call.args, **<a href="http://call.kw">call.kw</a>)</div>
<div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\task.py&quot;, line 115, in __call__</div><div>    d.addCallback(cb)</div><div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\defer.py&quot;, line 195, in addCallback</div>
<div>    callbackKeywords=kw)</div><div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\defer.py&quot;, line 186, in addCallbacks</div><div>    self._runCallbacks()</div><div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\defer.py&quot;, line 328, in _runCallbacks</div>
<div>    self.result = callback(self.result, *args, **kw)</div><div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\task.py&quot;, line 103, in cb</div><div>    self._reschedule()</div><div>      File &quot;D:\dev\eggs\twisted-8.2.0-py2.6-win32.egg\twisted\internet\task.py&quot;, line 139, in _reschedule</div>
<div>    self.call = self.clock.callLater(nextTime - currentTime, self)</div><div>&gt;</div></div><div><br></div><div><br></div><div>Many thanks</div><div>Brad</div>