classification
Title: SIGALRM fails to interrupt time.sleep() call on Python 3.5
Type: Stage:
Components: Library (Lib) Versions: Python 3.5
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: martin.panter, ryan.petrello
Priority: normal Keywords:

Created on 2016-10-18 02:52 by ryan.petrello, last changed 2016-10-18 03:16 by martin.panter. This issue is now closed.

Messages (2)
msg278835 - (view) Author: Ryan Petrello (ryan.petrello) Date: 2016-10-18 02:52
I may have found a bug in SIGALRM handling in Python3.5.  I've not been able to reproduce the same issue in Python2.7 or 3.4.  Here's a simple example that illustrates the issue (which I'm able to reproduce on OS X 10.11.3 El Capitan and Ubuntu 14.04):

$ python2 --version; python3.4 --version; python3.5 --version
Python 2.7.11
Python 3.4.4
Python 3.5.1

$ cat alarm.py
import signal, time

def handler(signum, frame):
    print('Signal handler called with signal %s' % signum)

# Set the signal handler and a 1-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(1)

# We should not actually sleep for 10 seconds
time.sleep(10)
signal.alarm(0)

$ time python2 alarm.py
Signal handler called with signal 14
python2 alarm.py  0.04s user 0.02s system 5% cpu 1.075 total

$ time python3.4 alarm.py
Signal handler called with signal 14
python3.4 alarm.py  0.07s user 0.01s system 7% cpu 1.092 total

$ time python3.5 alarm.py
Signal handler called with signal 14
python3.5 alarm.py  0.09s user 0.02s system 1% cpu 10.115 total

Note that when run under python3.5, the program does not exit until 10 seconds have passed.
msg278838 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016-10-18 03:16
This is by design; see PEP 475, and the documentation <https://docs.python.org/3.5/library/time.html#time.sleep>.

If you make your signal handler raise an exception, it will interrupt the sleep() call most of the time. But if the signal happens to be received just before the sleep() call is about to be entered, the handler will only be run when the underlying OS sleep() call returns 10 s later.
History
Date User Action Args
2016-10-18 03:16:43martin.pantersetstatus: open -> closed

nosy: + martin.panter
messages: + msg278838

resolution: not a bug
2016-10-18 02:53:14ryan.petrellosettitle: SIGALRM fails to interrupt time.sleep() call on Python 3.6 -> SIGALRM fails to interrupt time.sleep() call on Python 3.5
2016-10-18 02:52:22ryan.petrellocreate