Browse Source

EventReceiver now sends heartbeat request to find workers

Ask Solem 15 năm trước cách đây
mục cha
commit
c2d2e8b54c
2 tập tin đã thay đổi với 13 bổ sung1 xóa
  1. 5 1
      celery/events/__init__.py
  2. 8 0
      celery/worker/control/builtins.py

+ 5 - 1
celery/events/__init__.py

@@ -103,8 +103,9 @@ class EventReceiver(object):
     """
     handlers = {}
 
-    def __init__(self, connection, handlers=None):
+    def __init__(self, connection, handlers=None, wakeup=True):
         self.connection = connection
+        self.wakeup = wakeup
         if handlers is not None:
             self.handlers = handlers
 
@@ -128,6 +129,9 @@ class EventReceiver(object):
         """
         consumer = self.consumer()
         consumer.consume()
+        if self.wakeup:
+            from celery.task.control import broadcast
+            broadcast("heartbeat")
         try:
             for iteration in count(0):
                 if limit and iteration > limit:

+ 8 - 0
celery/worker/control/builtins.py

@@ -42,6 +42,14 @@ def disable_events(panel):
     return {"ok": "events already disabled"}
 
 
+@Panel.register
+def heartbeat(panel):
+    panel.logger.info("Heartbeat requested by remote.")
+    dispatcher = panel.listener.event_dispatcher
+    if dispatcher.enabled:
+        dispatcher.send("worker-heartbeat")
+
+
 @Panel.register
 def set_loglevel(panel, loglevel=None):
     if loglevel is not None: