Преглед на файлове

New way to autodiscover task modules using importlib

Ask Solem преди 15 години
родител
ревизия
2dbc041560
променени са 2 файла, в които са добавени 29 реда и са изтрити 11 реда
  1. 28 10
      celery/discovery.py
  2. 1 1
      celery/tests/test_discovery.py

+ 28 - 10
celery/discovery.py

@@ -1,23 +1,41 @@
 """celery.discovery"""
-from django.conf import settings
+import imp
+import importlib
+_RACE_PROTECTION = False
 
 
 def autodiscover():
     """Include tasks for all applications in :setting:`INSTALLED_APPS`."""
-    return filter(None, [find_related_module(app, "tasks")
-                            for app in settings.INSTALLED_APPS])
+    from django.conf import settings
+    global _RACE_PROTECTION
+
+    if _RACE_PROTECTION:
+        return
+    _RACE_PROTECTION = True
+    try:
+        return filter(None, [find_related_module(app, "tasks")
+                                for app in settings.INSTALLED_APPS])
+    finally:
+        _RACE_PROTECTION = False
 
 
 def find_related_module(app, related_name):
     """Given an application name and a module name, tries to find that
-    module in the application, and running handler' if it finds it.
-    """
-
-    module = __import__(app, {}, {}, [related_name])
+    module in the application."""
 
     try:
-        related_module = getattr(module, related_name)
+        app_path = importlib.import_module(app).__path__
     except AttributeError:
-        return None
+        return
+
+    try:
+        imp.find_module(related_name, app_path)
+    except ImportError:
+        return
+
+    module = importlib.import_module("%s.%s" % (app, related_name))
 
-    return related_module
+    try:
+        return getattr(module, related_name)
+    except AttributeError:
+        return

+ 1 - 1
celery/tests/test_discovery.py

@@ -21,4 +21,4 @@ class TestDiscovery(unittest.TestCase):
         if "someapp" in settings.INSTALLED_APPS:
             settings.INSTALLED_APPS = settings.INSTALLED_APPS + \
                     ["xxxnot.aexist"]
-            self.assertDiscovery()
+            self.assertRaises(ImportError, autodiscover)