From a109dd956b3a6e3cd609f2990ca51c9cc261bdc3 Mon Sep 17 00:00:00 2001 From: oriagmon Date: Wed, 17 Oct 2018 17:54:11 +0300 Subject: [PATCH] found another variable I think should be locked --- src/core/events/handler.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 012415a..662b65e 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -10,9 +10,10 @@ from __main__ import config from ..types import ActiveHunter, Hunter from ...core.events.types import HuntFinished -import threading -working_count = 0 +global is_running_lock +is_running_lock = Lock() + # Inherits Queue object, handles events asynchronously class EventQueue(Queue, object): @@ -22,7 +23,9 @@ class EventQueue(Queue, object): self.active_hunters = dict() self.hooks = defaultdict(list) + is_running_lock.acquire() self.running = True + is_running_lock.release() self.workers = list() for i in range(num_worker): @@ -34,14 +37,14 @@ class EventQueue(Queue, object): t.daemon = True t.start() - # decorator wrapping for easy subscription def subscribe(self, event, hook=None, predicate=None): def wrapper(hook): self.subscribe_event(event, hook=hook, predicate=predicate) return hook + return wrapper - + # getting uninstantiated event object def subscribe_event(self, event, hook=None, predicate=None): if ActiveHunter in hook.__mro__: @@ -71,6 +74,7 @@ class EventQueue(Queue, object): # executes callbacks on dedicated thread as a daemon def worker(self): + is_running_lock.acquire() while self.running: hook = self.get() try: @@ -78,17 +82,20 @@ class EventQueue(Queue, object): except Exception as ex: logging.debug(ex.message) self.task_done() + is_running_lock.release() logging.debug("closing thread...") def notifier(self): - time.sleep(2) + time.sleep(2) while self.unfinished_tasks > 0: logging.debug("{} tasks left".format(self.unfinished_tasks)) time.sleep(3) # stops execution of all daemons def free(self): + is_running_lock.acquire() self.running = False + is_running_lock.release() with self.mutex: self.queue.clear()