[PEAK] Stopping PEAK application on SIGINT

Alexey Smishlayev alexey at xtech2.lv
Tue Sep 29 17:56:00 EDT 2015


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.eby-sarna.com/pipermail/peak/attachments/20150930/c18faa55/attachment.html


More information about the PEAK mailing list