|
@@ -13,6 +13,112 @@
|
|
|
Bootsteps
|
|
|
=========
|
|
|
|
|
|
+Blahblah blah, example bootstep:
|
|
|
+
|
|
|
+.. code-block:: python
|
|
|
+
|
|
|
+ from celery import Celery
|
|
|
+ from celery import bootsteps
|
|
|
+
|
|
|
+ class InfoStep(bootsteps.Step):
|
|
|
+
|
|
|
+ def __init__(self, parent, **kwargs):
|
|
|
+ # here we can prepare the Worker/Consumer object
|
|
|
+ # in any way we want, set attribute defaults and so on.
|
|
|
+ print('{0!r} is in init'.format(parent))
|
|
|
+
|
|
|
+ def start(self, parent):
|
|
|
+ # our step is started together with all other Worker/Consumer
|
|
|
+ # bootsteps.
|
|
|
+ print('{0!r} is starting'.format(parent))
|
|
|
+
|
|
|
+ def stop(self, parent):
|
|
|
+ # the Consumer calls stop every time the consumer is restarted
|
|
|
+ # (i.e. connection is lost) and also at shutdown. The Worker
|
|
|
+ # will call stop at shutdown only.
|
|
|
+ print('{0!r} is stopping'.format(parent))
|
|
|
+
|
|
|
+ def shutdown(self, parent):
|
|
|
+ # shutdown is called by the Consumer at shutdown, it's not
|
|
|
+ # called by Worker.
|
|
|
+ print('{0!r} is shutting down'.format(parent))
|
|
|
+
|
|
|
+ app = Celery(broker='amqp://')
|
|
|
+ app.steps['worker'].add(InfoStep)
|
|
|
+ app.steps['consumer'].add(InfoStep)
|
|
|
+
|
|
|
+Starting the worker with this step installed will give us the following
|
|
|
+logs::
|
|
|
+
|
|
|
+ <celery.apps.worker.Worker object at 0x101ad8410> is in init
|
|
|
+ <celery.worker.consumer.Consumer object at 0x101c2d790> is in init
|
|
|
+ [2013-05-29 16:18:20,544: WARNING/MainProcess]
|
|
|
+ <celery.apps.worker.Worker object at 0x101ad8410> is starting
|
|
|
+ [2013-05-29 16:18:21,577: WARNING/MainProcess]
|
|
|
+ <celery.worker.consumer.Consumer object at 0x101c2d8d0> is starting
|
|
|
+ <celery.worker.consumer.Consumer object at 0x101c2d790> is stopping
|
|
|
+ <celery.apps.worker.Worker object at 0x101ad8410> is stopping
|
|
|
+ <celery.worker.consumer.Consumer object at 0x101c2d790> is shutting down
|
|
|
+
|
|
|
+The ``print`` statements will be redirected to the logging subsystem after
|
|
|
+the worker has been initialized, so the "is starting" lines are timestamped.
|
|
|
+You may notice that this does no longer happen at shutdown, this is because
|
|
|
+the ``stop`` and ``shutdown`` methods are called inside a *signal handler*,
|
|
|
+and it's not safe to use logging inside such a handler.
|
|
|
+Logging with the Python logging module is not :term:`reentrant`,
|
|
|
+which means that you cannot interrupt the function and
|
|
|
+call it again later. It's important that the ``stop`` and ``shutdown`` methods
|
|
|
+you write is also :term:`reentrant`.
|
|
|
+
|
|
|
+Starting the worker with ``--loglevel=debug`` will show us more
|
|
|
+information about the boot process::
|
|
|
+
|
|
|
+ [2013-05-29 16:18:20,509: DEBUG/MainProcess] | Worker: Preparing bootsteps.
|
|
|
+ [2013-05-29 16:18:20,511: DEBUG/MainProcess] | Worker: Building graph...
|
|
|
+ <celery.apps.worker.Worker object at 0x101ad8410> is in init
|
|
|
+ [2013-05-29 16:18:20,511: DEBUG/MainProcess] | Worker: New boot order:
|
|
|
+ {Hub, Queues (intra), Pool, Autoreloader, Timer, StateDB,
|
|
|
+ Autoscaler, InfoStep, Beat, Consumer}
|
|
|
+ [2013-05-29 16:18:20,514: DEBUG/MainProcess] | Consumer: Preparing bootsteps.
|
|
|
+ [2013-05-29 16:18:20,514: DEBUG/MainProcess] | Consumer: Building graph...
|
|
|
+ <celery.worker.consumer.Consumer object at 0x101c2d8d0> is in init
|
|
|
+ [2013-05-29 16:18:20,515: DEBUG/MainProcess] | Consumer: New boot order:
|
|
|
+ {Connection, Mingle, Events, Gossip, InfoStep, Agent,
|
|
|
+ Heart, Control, Tasks, event loop}
|
|
|
+ [2013-05-29 16:18:20,522: DEBUG/MainProcess] | Worker: Starting Hub
|
|
|
+ [2013-05-29 16:18:20,522: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:20,522: DEBUG/MainProcess] | Worker: Starting Pool
|
|
|
+ [2013-05-29 16:18:20,542: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:20,543: DEBUG/MainProcess] | Worker: Starting InfoStep
|
|
|
+ [2013-05-29 16:18:20,544: WARNING/MainProcess]
|
|
|
+ <celery.apps.worker.Worker object at 0x101ad8410> is starting
|
|
|
+ [2013-05-29 16:18:20,544: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:20,544: DEBUG/MainProcess] | Worker: Starting Consumer
|
|
|
+ [2013-05-29 16:18:20,544: DEBUG/MainProcess] | Consumer: Starting Connection
|
|
|
+ [2013-05-29 16:18:20,559: INFO/MainProcess] Connected to amqp://guest@127.0.0.1:5672//
|
|
|
+ [2013-05-29 16:18:20,560: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:20,560: DEBUG/MainProcess] | Consumer: Starting Mingle
|
|
|
+ [2013-05-29 16:18:20,560: INFO/MainProcess] mingle: searching for neighbors
|
|
|
+ [2013-05-29 16:18:21,570: INFO/MainProcess] mingle: no one here
|
|
|
+ [2013-05-29 16:18:21,570: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:21,571: DEBUG/MainProcess] | Consumer: Starting Events
|
|
|
+ [2013-05-29 16:18:21,572: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:21,572: DEBUG/MainProcess] | Consumer: Starting Gossip
|
|
|
+ [2013-05-29 16:18:21,577: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:21,577: DEBUG/MainProcess] | Consumer: Starting InfoStep
|
|
|
+ [2013-05-29 16:18:21,577: WARNING/MainProcess]
|
|
|
+ <celery.worker.consumer.Consumer object at 0x101c2d8d0> is starting
|
|
|
+ [2013-05-29 16:18:21,578: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:21,578: DEBUG/MainProcess] | Consumer: Starting Heart
|
|
|
+ [2013-05-29 16:18:21,579: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:21,579: DEBUG/MainProcess] | Consumer: Starting Control
|
|
|
+ [2013-05-29 16:18:21,583: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:21,583: DEBUG/MainProcess] | Consumer: Starting Tasks
|
|
|
+ [2013-05-29 16:18:21,606: DEBUG/MainProcess] basic.qos: prefetch_count->80
|
|
|
+ [2013-05-29 16:18:21,606: DEBUG/MainProcess] ^-- substep ok
|
|
|
+ [2013-05-29 16:18:21,606: DEBUG/MainProcess] | Consumer: Starting event loop
|
|
|
+ [2013-05-29 16:18:21,608: WARNING/MainProcess] celery@example.com ready.
|
|
|
+
|
|
|
.. figure:: ../images/worker_graph_full.png
|
|
|
|
|
|
.. _extending-worker-bootsteps:
|