Все объекты имеют метод финализатора, даже если Вы не реализовали один при помощи c# деструктора (который, как на самом деле гарантируют, не назовет GC). Это - просто хорошая практика для подавления вызова при реализации IDisposable, потому что это означает, что Вы решили выполнить завершение explictly.
Пример, с которым вы связались, неверен, и исключение фактически возникает при вызове обработчика аварийных сигналов, а не при чтении блоков. Лучше попробуйте следующее:
import signal
TIMEOUT = 5 # number of seconds your want for timeout
def interrupted(signum, frame):
"called when read times out"
print 'interrupted!'
signal.signal(signal.SIGALRM, interrupted)
def input():
try:
print 'You have 5 seconds to type in your stuff...'
foo = raw_input()
return foo
except:
# timeout
return
# set alarm
signal.alarm(TIMEOUT)
s = input()
# disable the alarm after success
signal.alarm(0)
print 'You typed', s
Использование вызова select короче и должно быть намного более переносимым
import sys, select
print "You have ten seconds to answer!"
i, o, e = select.select( [sys.stdin], [], [], 10 )
if (i):
print "You said", sys.stdin.readline().strip()
else:
print "You said nothing!"