On Thu, Feb 7, 2019 at 4:13 PM E. Madison Bray <erik.m.b...@gmail.com> wrote: > > On Wed, Feb 6, 2019 at 8:52 PM Nils Bruin <nbr...@sfu.ca> wrote: > > > > On Wednesday, February 6, 2019 at 6:35:27 AM UTC-8, E. Madison Bray wrote: > >> > >> > >> Which is being reached because AlarmInterrupt is a subclass of > >> KeyboardInterrupt . I don't know why this doesn't happen then when, > >> say, mashing Ctrl-C. I guess because IPython installs its own SIGINT > >> handler or something. > > > > > > In IPython proper the behaviour is different: > > > > > > In [1]: import signal > > > > In [2]: signal.alarm(1) > > Out[2]: 0 > > > > In [3]: Alarm clock > > <exit> > > > > This is the same as in python: > > > > >>> import signal > > >>> signal.alarm(1) > > 0 > > >>> Alarm clock > > > > It looks like this is just the default signal handler for python (the one > > that just prints the signal name and exits) > > > > Note that cysignals.signals.AlarmInterrupt is our own invention, so if the > > problem is inheriting from KeyboardInterrupt, we should probably not do > > that. > > IIRC there is a good rationale for that, though I don't see it > explicitly documented anywhere. I think it's simply that in most code > where you would want to catch an AlarmInterrupt (i.e. you set an alarm > on some code that should not be allowed to run for more than a certain > amount of time), you would also likely want to break out of it > manually with a Ctrl-C, and you would want those two cases handled the > same. So you kill two birds with one stone this way, rather than > having to write `except (AlarmInterrupt, KeyboardInterrupt)`. In > other words, the AlarmInterrupt is treated sort of as an automatic > KeyboardInterrupt on a timer. > > This can be avoided of course by explicitly writing `except > (AlarmInterrupt, KeyboardInterrupt)`, but I do like the existing > design on principle. I think in this case its better to address the > specific problem. I find it odd that IPython would allow an interrupt > arising from user code to break out of its event loop. It seems to > happen in the case of code being run via signal handlers, because if I > just enter `raise KeyboardInterrupt` at the prompt, this happens: > > sage: raise KeyboardInterrupt > --------------------------------------------------------------------------- > KeyboardInterrupt Traceback (most recent call last) > <ipython-input-1-c761920b81b0> in <module>() > ----> 1 raise KeyboardInterrupt > > KeyboardInterrupt: > > So, no problem. But I can reproduce the problem with Sage's alarm() > using pure Python+stdlib like: > > sage: import signal > sage: def raise_keyboard_interrupt(*args): > ....: raise KeyboardInterrupt > ....: > sage: signal.signal(signal.SIGALRM, raise_keyboard_interrupt) > 0 > sage: signal.alarm(1) > 0
Forgot to paste the rest of this example. Point being it does the same thing: sage: import signal sage: def raise_keyboard_interrupt(*args): ....: raise KeyboardInterrupt ....: sage: signal.signal(signal.SIGALRM, raise_keyboard_interrupt) 0 sage: signal.alarm(1) 0 sage: KeyboardInterrupt escaped interact() sage: sage: ^[[41;1R ********************************************************************** Oops, Sage crashed. We do our best to make it stable, but... -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at https://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.