From 9aac2393d39b8efaee00a0077c9986e41d4a7ad6 Mon Sep 17 00:00:00 2001 From: Jonathan Klaassen Date: Thu, 12 Nov 2015 17:07:52 -0800 Subject: [PATCH] Fix loader race condition. --- voom/__init__.py | 2 +- voom/adaptors/django/discover.py | 31 +++++++++++++++++-------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/voom/__init__.py b/voom/__init__.py index a890b80..5e58d1c 100644 --- a/voom/__init__.py +++ b/voom/__init__.py @@ -1,3 +1,3 @@ import threading -__version__ = "1.2.0" +__version__ = "1.3.0" diff --git a/voom/adaptors/django/discover.py b/voom/adaptors/django/discover.py index 58b9ce5..c61b327 100644 --- a/voom/adaptors/django/discover.py +++ b/voom/adaptors/django/discover.py @@ -1,27 +1,30 @@ -from logging import getLogger import imp import importlib +from logging import getLogger +import threading + LOG = getLogger(__name__) -_RACE_PROTECTION = False # protect against shenanigans. +_HANDLERS_LOADED = False # protect against shenanigans. def autodiscover_bus_handlers(): """Include handlers for all applications in ``INSTALLED_APPS``.""" from django.conf import settings - #from django.conf import settings - global _RACE_PROTECTION - - if _RACE_PROTECTION: - return - _RACE_PROTECTION = True - try: - LOG.info("Discovering bus handlers...") - return filter(None, [find_related_module(app, "handlers") - for app in settings.INSTALLED_APPS]) - finally: - _RACE_PROTECTION = False + # from django.conf import settings + global _HANDLERS_LOADED + + with threading.RLock(): + if _HANDLERS_LOADED: + return + _HANDLERS_LOADED = True + try: + LOG.info("Discovering bus handlers...") + return filter(None, [find_related_module(app, "handlers") + for app in settings.INSTALLED_APPS]) + finally: + _HANDLERS_LOADED = False def find_related_module(app, related_name):