Raise a timeout exception after X seconds
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
Comments (0)
Trackbacks (0)
Leave a comment
Trackback