[PEAK] Stopping PEAK application on SIGINT

PJ Eby pje at telecommunity.com
Tue Sep 29 19:12:45 EDT 2015


The failure is in trying to retrieve the `signals()` method from the
ISignalSource, which should be the io_events.SignalSource singleton.
What I don't understand is why it's recursing on the attempt to
retrieve the signals attribute.  Specifically, it seems as though this
should only be able to happen if trying to load the 'sigsrc' attribute
results in an attempt to load the 'signals' attribute.  I would
suggest stepping through with the debugger from line 66 of
scheduler.py and see if you can tell what's happening there.

On Tue, Sep 29, 2015 at 5:56 PM, Alexey Smishlayev <alexey at xtech2.lv> wrote:
> Hello, Phillip!
>
> I use binding.Obtain() on "peak.running.interfaces.IMainLoop", which seem to
> be instantiating as "peak.running.scheduler.MainLoop" and the
> "peak.events.interfaces.IEventLoop" is bound to
> "peak.events.twisted_support.EventLoop". Did not go that far, looked at the
> PEAK default event loop and couldn't figure out what's wrong (without
> investgating links in the project's .ini file).
>
> Does that mean I cannot use stopOnSignals with the Twisted event loop? Do I
> have to implement that method? I believe, it's used because Twisted handles
> TCP communications for us.
>
>
> Best regards,
> Alexey Smishlayev
>
>
> On 30/09/15 00:27, PJ Eby wrote:
>
> Which event loop are you using?  Twisted, the PEAK default, or
> something else?  The issue here appears to be that the eventLoop
> property of the MainLoop instance lacks a `signals()` method -- which
> would seem to mean it doesn't fully implement IEventLoop or is the
> wrong type of object to start with.
>
> On Tue, Sep 29, 2015 at 8:06 AM, Alexey Smishlayev <alexey at xtech2.lv> wrote:
>
> Good day everyone!
> I would like my PEAK application to stop on ^C or SIGINT. Currently, in that
> case I get an output something like
>
> 29.09.2015 14:56:48.179 [DEBUG] Connect.twisted Unexpected error in main
> loop.
> 29.09.2015 14:56:48.190 [ERROR] Connect.twisted Traceback (most recent
> call last):
> 29.09.2015 14:56:48.190 [ERROR]   File
> "/Users/alexey/xtech2/tester/build/lib/ank/BBS/CommandBase.py", line 38, in
> run
> 29.09.2015 14:56:48.190 [ERROR]     self.mainLoop.run()
> 29.09.2015 14:56:48.190 [ERROR]   File
> "/Library/Python/2.7/site-packages/peak/running/scheduler.py", line 78, in
> run
> 29.09.2015 14:56:48.190 [ERROR]     return
> self.eventLoop.runUntil(self.exitCode,True,idle=self.sleep)[0]
> 29.09.2015 14:56:48.190 [ERROR]   File
> "/Library/Python/2.7/site-packages/peak/events/twisted_support.py", line
> 186, in runUntil
> 29.09.2015 14:56:48.190 [ERROR]     self.reactor.run(False)
> 29.09.2015 14:56:48.190 [ERROR]   File
> "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/base.py",
> line 1192, in run
> 29.09.2015 14:56:48.190 [ERROR]     self.mainLoop()
> 29.09.2015 14:56:48.190 [ERROR] --- <exception caught here> ---
> 29.09.2015 14:56:48.190 [ERROR]   File
> "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/base.py",
> line 1204, in mainLoop
> 29.09.2015 14:56:48.190 [ERROR]     self.doIteration(t)
> 29.09.2015 14:56:48.190 [ERROR]   File
> "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/selectreactor.py",
> line 105, in doSelect
> 29.09.2015 14:56:48.190 [ERROR]     [], timeout)
> 29.09.2015 14:56:48.190 [ERROR] exceptions.KeyboardInterrupt:
>
> in the log file. In CommandBase.py attribute self.mainloop is defined as
>
> from peak.api import binding
> from peak.running import commands, interfaces
> class CommandBase(commands.EventDriven):
>     mainLoop = binding.Obtain(interfaces.IMainLoop)
>     ...
>
> If I set "peak.running.mainLoop.stopOnSignals" in my project's .ini file to
> anything else except empty tuple, on the application's startup I get the
> following error (I tried "stopOnSignals = ('SIGINT',)")
>
> Traceback (most recent call last):
>   File "../ank/BBS/Assembler.py", line 370, in run
>     _exitCode = _root.run()
>   File "/Library/Python/2.7/site-packages/peak/running/commands.py", line
> 229, in run
>     return self._run() or 0
>   File "/Library/Python/2.7/site-packages/peak/running/commands.py", line
> 509, in _run
>     return self.invoke()
>   File "/Users/alexey/xtech2/tester/build/lib/ank/BBS/CommandBase.py",
> line 38, in run
>     self.mainLoop.run()
>   File "/Library/Python/2.7/site-packages/peak/running/scheduler.py", line
> 66, in run
>     handler = self.eventLoop.signals(*self.stopOnSignals)
>   File "_once.pyx", line 112, in _once.BaseDescriptor.__get__
>   File "_once.pyx", line 100, in _once.__get__
>   File "/Library/Python/2.7/site-packages/peak/binding/components.py",
> line 682, in delegate
>     return getattr(getattr(s,delegateAttr),a)
>   File "_once.pyx", line 112, in _once.BaseDescriptor.__get__
>   File "_once.pyx", line 100, in _once.__get__
>   File "/Library/Python/2.7/site-packages/peak/binding/components.py",
> line 682, in delegate
>     return getattr(getattr(s,delegateAttr),a)
>   File "_once.pyx", line 88, in _once.BaseDescriptor.__get__
> AttributeError: ('Recursive attempt to compute attribute', 'signals')
>
> How do I do everything correctly?
>
>
> Best regards,
> Alexey Smishlayev
>
> _______________________________________________
> PEAK mailing list
> PEAK at eby-sarna.com
> http://www.eby-sarna.com/mailman/listinfo/peak
>
>
>
> _______________________________________________
> PEAK mailing list
> PEAK at eby-sarna.com
> http://www.eby-sarna.com/mailman/listinfo/peak


More information about the PEAK mailing list