diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2012-12-12 08:56:17 -0500 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2012-12-12 08:56:17 -0500 |
commit | e89d42768d7743a826dc7a11641704c90ddfc5b7 (patch) | |
tree | 24f39196775d9fe75befd373bb5253598bb2c948 | |
parent | 66e11a608ce5d894d9a98d42b80e570f3585935c (diff) | |
download | cherrypy-e89d42768d7743a826dc7a11641704c90ddfc5b7.tar.gz |
Extract Thread.daemon property compatibility into _cpcompat. Now BackgroundTask behaves like a Python 2.6+ Thread (w.r.t. the daemon property) even on Python 2.3+.
-rw-r--r-- | cherrypy/_cpcompat.py | 11 | ||||
-rw-r--r-- | cherrypy/process/plugins.py | 17 |
2 files changed, 18 insertions, 10 deletions
diff --git a/cherrypy/_cpcompat.py b/cherrypy/_cpcompat.py index 0e9d38c1..4e703703 100644 --- a/cherrypy/_cpcompat.py +++ b/cherrypy/_cpcompat.py @@ -334,3 +334,14 @@ else: # Python 3.2 and earlier Timer = threading._Timer Event = threading._Event + +# Prior to Python 2.6, the Thread class did not have a .daemon property. +# This mix-in adds that property. +class SetDaemonProperty: + def __get_daemon(self): + return self.isDaemon() + def __set_daemon(self, daemon): + self.setDaemon(daemon) + + if sys.version_info < (2,6): + daemon = property(__get_daemon, __set_daemon) diff --git a/cherrypy/process/plugins.py b/cherrypy/process/plugins.py index 8be25505..03e76856 100644 --- a/cherrypy/process/plugins.py +++ b/cherrypy/process/plugins.py @@ -7,7 +7,8 @@ import sys import time import threading -from cherrypy._cpcompat import basestring, get_daemon, get_thread_ident, ntob, set, Timer +from cherrypy._cpcompat import (basestring, get_daemon, get_thread_ident, + ntob, set, Timer, SetDaemonProperty) # _module__file__base is used by Autoreload to make # absolute any filenames retrieved from sys.modules which are not @@ -450,7 +451,7 @@ class PerpetualTimer(Timer): raise -class BackgroundTask(threading.Thread): +class BackgroundTask(SetDaemonProperty, threading.Thread): """A subclass of threading.Thread whose run() method repeats. Use this class for most repeating tasks. It uses time.sleep() to wait @@ -460,7 +461,7 @@ class BackgroundTask(threading.Thread): it won't delay stopping the whole process. """ - def __init__(self, interval, function, args=[], kwargs={}, bus=None, daemon=True): + def __init__(self, interval, function, args=[], kwargs={}, bus=None): threading.Thread.__init__(self) self.interval = interval self.function = function @@ -468,10 +469,9 @@ class BackgroundTask(threading.Thread): self.kwargs = kwargs self.running = False self.bus = bus - if daemon is not None: - self.daemon = daemon - else: - self.daemon = current_thread().daemon + + # default to daemonic + self.daemon = True def cancel(self): self.running = False @@ -491,9 +491,6 @@ class BackgroundTask(threading.Thread): # Quit on first error to avoid massive logs. raise - def _set_daemon(self): - return True - class Monitor(SimplePlugin): """WSPBus listener to periodically run a callback in its own thread.""" |