浏览代码

Workers not inheriting the django env is only a problem on systems without fork()

Ask Solem 16 年之前
父节点
当前提交
1fe61b60a0
共有 1 个文件被更改,包括 12 次插入5 次删除
  1. 12 5
      celery/loaders/__init__.py

+ 12 - 5
celery/loaders/__init__.py

@@ -1,3 +1,4 @@
+import os
 from celery.loaders.djangoapp import Loader as DjangoLoader
 from celery.loaders.djangoapp import Loader as DjangoLoader
 from celery.loaders.default import Loader as DefaultLoader
 from celery.loaders.default import Loader as DefaultLoader
 from django.conf import settings
 from django.conf import settings
@@ -13,12 +14,18 @@ Loader = DefaultLoader
 if settings.configured:
 if settings.configured:
     Loader = DjangoLoader
     Loader = DjangoLoader
 else:
 else:
-    # We might still be running celery with django, because worker processes
-    # spawned with celery running through manage.py, will not have had their
-    # django environment set up
+    if callable(getattr(os, "fork", None)): # Platform doesn't support fork()
+        # XXX On systems without fork, multiprocessing seems to be launching
+        # the processes in some other way which does not copy the memory
+        # of the parent process. This means that any configured env might
+        # be lost. This is a hack to make it work on Windows.
+        # A better way might be to use os.environ to set the currently
+        # used configuration method so to propogate it to the "child"
+        # processes. But this has to be experimented with.
+        # [asksol/heyman]
     try:
     try:
-        # If we can import 'settings', assume we're running celery with django
-        import settings as project_settings
+        settings_mod = os.environ.get("DJANGO_SETTINGS_MODULE", "settings")
+        project_settings = __import__(settings_mod, {}, {}, [''])
         setup_environ(project_settings)
         setup_environ(project_settings)
         Loader = DjangoLoader
         Loader = DjangoLoader
     except ImportError:
     except ImportError: