From b07be13d6929385362739e4ba0061d87aed61cfa Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Sat, 29 Oct 2016 19:25:21 -0400 Subject: [PATCH] Readded scheduler tests, added thread tracking --- app/scheduler.py | 15 +++++++++++---- app/tests/test_app.py | 9 ++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/scheduler.py b/app/scheduler.py index 96873b8e..f71b2710 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -10,8 +10,9 @@ import random logger = logging.getLogger('app.logger') scheduler = BackgroundScheduler() +threads = [] # Keep track of alive threads -def job(func): +def background(func): """ Adds background={True|False} param to any function so that we can call update_nodes_info(background=True) from the outside @@ -19,15 +20,20 @@ def job(func): def wrapper(*args,**kwargs): background = kwargs.get('background', False) if background: + # Need to initialize reference to variable in order + # to use it from a decorator: http://stackoverflow.com/questions/10913060/local-variable-referenced-before-assignment-for-decorator + threads_local = threads + t = Thread(target=func) + threads_local.append(t) + threads_local = filter(lambda u: u.is_alive(), threads_local) t.start() return t else: return func(*args, **kwargs) return wrapper - -@job +@background def update_nodes_info(): processing_nodes = ProcessingNode.objects.all() for processing_node in processing_nodes: @@ -36,7 +42,7 @@ def update_nodes_info(): tasks_mutex = Lock() -@job +@background def process_pending_tasks(): tasks = [] try: @@ -76,6 +82,7 @@ def setup(): def teardown(): logger.info("Stopping scheduler...") try: + for t in threads: t.join() scheduler.shutdown() logger.info("Scheduler stopped") except SchedulerNotRunningError: diff --git a/app/tests/test_app.py b/app/tests/test_app.py index fa6d9089..55af1773 100644 --- a/app/tests/test_app.py +++ b/app/tests/test_app.py @@ -139,13 +139,12 @@ class TestApp(BootTestCase): def test_scheduler(self): - pass - #self.assertTrue(scheduler.setup() == None) + self.assertTrue(scheduler.setup() == None) # Can call update_nodes_info() - #self.assertTrue(scheduler.update_nodes_info() == None) + self.assertTrue(scheduler.update_nodes_info() == None) # Can call function in background - #self.assertTrue(scheduler.update_nodes_info(background=True).join() == None) + self.assertTrue(scheduler.update_nodes_info(background=True).join() == None) - #self.assertTrue(scheduler.teardown() == None) + self.assertTrue(scheduler.teardown() == None)