瀏覽代碼

Monkey patches the multiprocessing backport "processName" error

Ask Solem 15 年之前
父節點
當前提交
9a1ac8398c
共有 2 個文件被更改,包括 33 次插入2 次删除
  1. 29 0
      celery/patch.py
  2. 4 2
      celery/pool.py

+ 29 - 0
celery/patch.py

@@ -0,0 +1,29 @@
+import logging
+import sys
+
+
+def _check_logger_class():
+    """Make sure process name is recorded when loggers are used."""
+
+    from multiprocessing.process import current_process
+    logging._acquireLock()
+    try:
+        OldLoggerClass = logging.getLoggerClass()
+        if not getattr(OldLoggerClass, '_process_aware', False):
+
+            class ProcessAwareLogger(OldLoggerClass):
+                _process_aware = True
+
+                def makeRecord(self, *args, **kwds):
+                    record = OldLoggerClass.makeRecord(self, *args, **kwds)
+                    record.processName = current_process()._name
+                    return record
+            logging.setLoggerClass(ProcessAwareLogger)
+    finally:
+        logging._releaseLock()
+
+def monkeypatch():
+    major, minor = sys.version_info[:2]
+    if major == 2 and minor < 6: # python < 2.6
+        _check_logger_class()
+

+ 4 - 2
celery/pool.py

@@ -6,12 +6,13 @@ Process Pools.
 import os
 import os
 import errno
 import errno
 import multiprocessing
 import multiprocessing
-
 from multiprocessing.pool import Pool, worker
 from multiprocessing.pool import Pool, worker
+from operator import isNumberType
+
 from celery.datastructures import ExceptionInfo
 from celery.datastructures import ExceptionInfo
 from celery.utils import noop
 from celery.utils import noop
 from celery.utils.functional import curry
 from celery.utils.functional import curry
-from operator import isNumberType
+from celery.patch import monkeypatch
 
 
 
 
 def pid_is_dead(pid):
 def pid_is_dead(pid):
@@ -197,6 +198,7 @@ class TaskPool(object):
         self.limit = limit
         self.limit = limit
         self.logger = logger or multiprocessing.get_logger()
         self.logger = logger or multiprocessing.get_logger()
         self._pool = None
         self._pool = None
+        monkeypatch() # Patch "no processName" logging error.
 
 
     def start(self):
     def start(self):
         """Run the task pool.
         """Run the task pool.