From 0805c7fc04a059c90c5d2912e92893d35ccb177e Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 31 Aug 2010 20:17:27 -0400 Subject: [PATCH] Adding a timelimit to fetching the feed. --- utils/feed_fetcher.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/utils/feed_fetcher.py b/utils/feed_fetcher.py index b652e4cdb..876476289 100644 --- a/utils/feed_fetcher.py +++ b/utils/feed_fetcher.py @@ -33,6 +33,36 @@ def mtime(ttime): """ return datetime.datetime.fromtimestamp(time.mktime(ttime)) +import threading +class TimeoutError(Exception): pass +def timelimit(timeout): + """borrowed from web.py""" + def _1(function): + def _2(*args, **kw): + class Dispatch(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + self.result = None + self.error = None + + self.setDaemon(True) + self.start() + + def run(self): + try: + self.result = function(*args, **kw) + except: + self.error = sys.exc_info() + + c = Dispatch() + c.join(timeout) + if c.isAlive(): + raise TimeoutError, 'took too long' + if c.error: + raise c.error[0], c.error[1] + return c.result + return _2 + return _1 class FetchFeed: def __init__(self, feed, options): @@ -40,6 +70,7 @@ class FetchFeed: self.options = options self.fpf = None + @timelimit(20) def fetch(self): """ Downloads and parses a feed. """