Archive
Posts Tagged ‘timeout’
Raise a timeout exception after X seconds
December 8, 2012
Leave a comment
Problem
You make a call that may stuck (for instance downloading a webpage). How to timeout after some time?
Solution
I found the following tip at http://stackoverflow.com/questions/8464391 (Unix only):
import signal
import time
def test_request(arg=None):
"""Your http request."""
time.sleep(2)
return arg
class Timeout():
"""Timeout class using ALARM signal."""
class Timeout(Exception):
pass
def __init__(self, sec):
self.sec = sec
def __enter__(self):
signal.signal(signal.SIGALRM, self.raise_timeout)
signal.alarm(self.sec)
def __exit__(self, *args):
signal.alarm(0) # disable alarm
def raise_timeout(self, *args):
raise Timeout.Timeout()
def main():
# Run block of code with timeouts
try:
with Timeout(3):
print test_request("Request 1")
with Timeout(1):
print test_request("Request 2")
except Timeout.Timeout:
print "Timeout"
#############################################################################
if __name__ == "__main__":
main()
Note that time for signal.alarm must be specified in seconds (integer value).
Output:
Request 1 Timeout
