From 57e586575aa4b412b9af98d46e3a598f48be9b26 Mon Sep 17 00:00:00 2001 From: Massimo DiPierro Date: Fri, 4 May 2012 10:27:05 -0500 Subject: [PATCH] better -E -b -L options for scheduler, thanks niphlod --- VERSION | 2 +- gluon/scheduler.py | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/VERSION b/VERSION index 45b0164b..224f867e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.7 (2012-05-03 21:00:21) dev +Version 1.99.7 (2012-05-04 10:27:00) dev diff --git a/gluon/scheduler.py b/gluon/scheduler.py index f77d9278..ed4d8879 100644 --- a/gluon/scheduler.py +++ b/gluon/scheduler.py @@ -53,15 +53,19 @@ import datetime import logging import optparse +if 'WEB2PY_PATH' in os.environ: + sys.path.append(os.environ['WEB2PY_PATH']) +else: + os.environ['WEB2PY_PATH'] = os.getcwd() + +if not os.environ['WEB2PY_PATH'] in sys.path: + sys.path.append(os.environ['WEB2PY_PATH']) + try: from gluon.contrib.simplejson import loads, dumps except: from simplejson import loads, dumps -if 'WEB2PY_PATH' in os.environ: - sys.path.append(os.environ['WEB2PY_PATH']) -else: - os.environ['WEB2PY_PATH'] = os.getcwd() from gluon import DAL, Field, IS_NOT_EMPTY, IS_IN_SET from gluon.utils import web2py_uuid @@ -175,6 +179,8 @@ class MetaScheduler(threading.Thread): threading.Thread.__init__(self) self.process = None # the backround process self.have_heartbeat = True # set to False to kill + self.empty_runs = 0 + def async(self,task): """ starts the background process and returns: @@ -256,9 +262,16 @@ class MetaScheduler(threading.Thread): logging.debug('looping...') task = self.pop_task() if task: + self.empty_runs = 0 self.report_task(task,self.async(task)) else: + self.empty_runs += 1 logging.debug('sleeping...') + if self.max_empty_runs <> 0: + logging.debug('empty runs %s/%s', self.empty_runs, self.max_empty_runs) + if self.empty_runs >= self.max_empty_runs: + logging.info('empty runs limit reached, killing myself') + self.die() self.sleep() except KeyboardInterrupt: self.die() @@ -294,7 +307,7 @@ class TYPE(object): class Scheduler(MetaScheduler): def __init__(self,db,tasks={},migrate=True, - worker_name=None,group_names=None,heartbeat=HEARTBEAT): + worker_name=None,group_names=None,heartbeat=HEARTBEAT,max_empty_runs=0): MetaScheduler.__init__(self) @@ -304,6 +317,7 @@ class Scheduler(MetaScheduler): self.group_names = group_names or ['main'] self.heartbeat = heartbeat self.worker_name = worker_name or socket.gethostname()+'#'+str(web2py_uuid()) + self.max_empty_runs = max_empty_runs from gluon import current current._scheduler = self @@ -495,11 +509,17 @@ def main(): help="start a worker with name") parser.add_option( "-b", "--heartbeat",dest="heartbeat", default = 10, - help="heartbeat time in seconds (default 10)") + type='int', help="heartbeat time in seconds (default 10)") parser.add_option( "-L", "--logger_level",dest="logger_level", - default = 'INFO', - help="level of logging (DEBUG, INFO, WARNING, ERROR)") + default=30, + type='int', + help="set debug output level (0-100, 0 means all, 100 means none;default is 30)") + parser.add_option("-E", "--empty-runs", + dest="max_empty_runs", + type='int', + default = 0, + help="max loops with no grabbed tasks permitted (0 for never check)") parser.add_option( "-g", "--group_names",dest="group_names", default = 'main', @@ -543,7 +563,8 @@ def main(): tasks = tasks, migrate = True, group_names = group_names, - heartbeat = options.heartbeat) + heartbeat = options.heartbeat, + max_empty_runs = options.max_empty_runs) print 'starting main worker loop...' scheduler.loop()