| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733 | .. _whatsnew-4.0:=========================================== What's new in Celery 4.0 (0Today8)===========================================:Author: Ask Solem (ask at celeryproject.org).. sidebar:: Change history    What's new documents describe the changes in major versions,    we also have a :ref:`changelog` that lists the changes in bugfix    releases (0.0.x), while older series are archived under the :ref:`history`    section.Celery is a simple, flexible and reliable distributed system toprocess vast amounts of messages, while providing operations withthe tools required to maintain such a system.It's a task queue with focus on real-time processing, while alsosupporting task scheduling.Celery has a large and diverse community of users and contributors,you should come join us :ref:`on IRC <irc-channel>`or :ref:`our mailing-list <mailing-list>`.To read more about Celery you should go read the :ref:`introduction <intro>`.While this version is backward compatible with previous versionsit's important that you read the following section.This version is officially supported on CPython 2.7, 3.4 and 3.5.and also supported on PyPy... _`website`: http://celeryproject.org/.. topic:: Table of Contents    Make sure you read the important notes before upgrading to this version... contents::    :local:    :depth: 2Preface=======.. _v320-important:Important Notes===============Dropped support for Python 2.6------------------------------Celery now requires Python 2.7 or later,and also drops support for Python 3.3 so supported versions are:- CPython 2.7- CPython 3.4- CPython 3.5- PyPy 4.0 (pypy2)- PyPy 2.4 (pypy3)- Jython 2.7.0JSON is now the default serializer----------------------------------The Task base class no longer automatically register tasks----------------------------------------------------------The metaclass has been removed blah blahArguments now verified when calling a task------------------------------------------Redis Events not backward compatible------------------------------------The Redis ``fanout_patterns`` and ``fanout_prefix`` transportoptions are now enabled by default, which means that workersrunning 4.0 cannot see workers running 3.1 and vice versa.They should still execute tasks as normally, so this is onlyrelated to monitoring events.To avoid this situation you can reconfigure the 3.1 workers (and clients)to enable these settings before you mix them with workers and clientsrunning 4.x:.. code-block:: python    BROKER_TRANSPORT_OPTIONS = {        'fanout_patterns': True,        'fanout_prefix': True,    }Lowercase setting names-----------------------In the pursuit of beauty all settings have been renamed to be in alllowercase, in a consistent naming scheme.This change is fully backwards compatible so you can still use the uppercasesetting names.The loader will try to detect if your configuration is using the new format,and act accordingly, but this also means that you are not allowed to mix andmatch new and old setting names, that is unless you provide a value for bothalternatives.The major difference between previous versions, apart from the lower casenames, are the renaming of some prefixes, like ``celerybeat_`` to ``beat_``,``celeryd_`` to ``worker_``.The ``celery_`` prefix has also been removed, and task related settingsfrom this namespace is now prefixed by ``task_``, worker related settingswith ``worker_``.Apart from this most of the settings will be the same in lowercase, apart froma few special ones:=====================================  ==========================================================**Setting name**                       **Replace with**=====================================  ==========================================================``CELERY_MAX_CACHED_RESULTS``          :setting:`result_cache_max```CELERY_MESSAGE_COMPRESSION``         :setting:`result_compression`/:setting:`task_compression`.``CELERY_TASK_RESULT_EXPIRES``         :setting:`result_expires```CELERY_RESULT_DBURI``                :setting:`sqlalchemy_dburi```CELERY_RESULT_ENGINE_OPTIONS``       :setting:`sqlalchemy_engine_options```-*-_DB_SHORT_LIVED_SESSIONS``        :setting:`sqlalchemy_short_lived_sessions```CELERY_RESULT_DB_TABLE_NAMES``       :setting:`sqlalchemy_db_names```CELERY_ACKS_LATE``                   :setting:`task_acks_late```CELERY_ALWAYS_EAGER``                :setting:`task_always_eager```CELERY_ANNOTATIONS``                 :setting:`task_annotations```CELERY_MESSAGE_COMPRESSION``         :setting:`task_compression```CELERY_CREATE_MISSING_QUEUES``       :setting:`task_create_missing_queues```CELERY_DEFAULT_DELIVERY_MODE``       :setting:`task_default_delivery_mode```CELERY_DEFAULT_EXCHANGE``            :setting:`task_default_exchange```CELERY_DEFAULT_EXCHANGE_TYPE``       :setting:`task_default_exchange_type```CELERY_DEFAULT_QUEUE``               :setting:`task_default_queue```CELERY_DEFAULT_RATE_LIMIT``          :setting:`task_default_rate_limit```CELERY_DEFAULT_ROUTING_KEY``         :setting:`task_default_routing_key```-"-_EAGER_PROPAGATES_EXCEPTIONS``    :setting:`task_eager_propagates```CELERY_IGNORE_RESULT``               :setting:`task_ignore_result```CELERY_TASK_PUBLISH_RETRY``          :setting:`task_publish_retry```CELERY_TASK_PUBLISH_RETRY_POLICY``   :setting:`task_publish_retry_policy```CELERY_QUEUES``                      :setting:`task_queues```CELERY_ROUTES``                      :setting:`task_routes```CELERY_SEND_TASK_ERROR_EMAILS``      :setting:`task_send_error_emails```CELERY_SEND_TASK_SENT_EVENT``        :setting:`task_send_sent_event```CELERY_TASK_SERIALIZER``             :setting:`task_serializer```CELERYD_TASK_SOFT_TIME_LIMIT``       :setting:`task_soft_time_limit```CELERYD_TASK_TIME_LIMIT``            :setting:`task_time_limit```CELERY_TRACK_STARTED``               :setting:`task_track_started```CELERY_DISABLE_RATE_LIMITS``         :setting:`worker_disable_rate_limits```CELERY_ENABLE_REMOTE_CONTROL``       :setting:`worker_enable_remote_control```CELERYD_SEND_EVENTS``                :setting:`worker_send_task_events`=====================================  ==========================================================You can see a full table of the changes in :ref:`conf-old-settings-map`.Django: Autodiscover no longer takes arguments.-----------------------------------------------Celery's Django support will instead automatically find your installed apps,which means app configurations will work.# e436454d02dcbba4f4410868ad109c54047c2c15Old command-line programs removed---------------------------------Installing Celery will no longer install the ``celeryd``,``celerybeat`` and ``celeryd-multi`` programs.This was announced with the release of Celery 3.1, but you may stillhave scripts pointing to the old names, so make sure you update themto use the new umbrella command.+-------------------+--------------+-------------------------------------+| Program           | New Status   | Replacement                         |+===================+==============+=====================================+| ``celeryd``       | **REMOVED**  | :program:`celery worker`            |+-------------------+--------------+-------------------------------------+| ``celerybeat``    | **REMOVED**  | :program:`celery beat`              |+-------------------+--------------+-------------------------------------+| ``celeryd-multi`` | **REMOVED**  | :program:`celery multi`             |+-------------------+--------------+-------------------------------------+.. _v320-news:News====New Task Message Protocol=========================# e71652d384b1b5df2a4e6145df9f0efb456bc71c``TaskProducer`` replaced by ``app.amqp.create_task_message`` and``app.amqp.send_task_message``.- Worker stores results for internal errors like ``ContentDisallowed``, and  exceptions occurring outside of the task function.- Worker stores results and sends monitoring events for unknown task names- shadow- argsrepr- Support for very long chains- parent_id / root_idPrefork: Tasks now log from the child process=============================================Logging of task success/failure now happens from the child processactually executing the task, which means that logging utilitieslike Sentry can get full information about tasks that fail, includingvariables in the traceback.Prefork: One logfile per child process======================================Init scrips and :program:`celery multi` now uses the `%I` logfile formatoption (e.g. :file:`/var/log/celery/%n%I.log`) to ensure each childprocess has a separate log file to avoid race conditions.You are encouraged to upgrade your init scripts and multi argumentsto do so also.Canvas Refactor===============# BLALBLABLAd79dcd8e82c5e41f39abd07ffed81ca58052bcd21e9dd26592eb2b93f1cb16deb771cfc65ab79612e442df61b2ff1fe855881c1e2ff9acc970090f540673da5c09ac22bdd49ba811c470b73a036ee776- Now unrolls groups within groups into a single group (Issue #1509).- chunks/map/starmap tasks now routes based on the target task- chords and chains can now be immutable.- Fixed bug where serialized signature were not converted back into  signatures (Issue #2078)    Fix contributed by Ross Deane.- Fixed problem where chains and groups did not work when using JSON  serialization (Issue #2076).    Fix contributed by Ross Deane.- Creating a chord no longer results in multiple values for keyword  argument 'task_id'" (Issue #2225).    Fix contributed by Aneil Mallavarapu- Fixed issue where the wrong result is returned when a chain  contains a chord as the penultimate task.    Fix contributed by Aneil Mallavarapu- Special case of ``group(A.s() | group(B.s() | C.s()))`` now works.- Chain: Fixed bug with incorrect id set when a subtask is also a chain.Schedule tasks based on sunrise, sunset, dawn and dusk.=======================================================See :ref:`beat-solar` for more information.Contributed by Mark Parncutt.App can now configure periodic tasks====================================# bc18d0859c1570f5eb59f5a969d1d32c63af764b# 132d8d94d38f4050db876f56a841d5a5e487b25bRabbitMQ Priority queue support===============================# 1d4cbbcc921aa34975bde4b503b8df9c2f1816e0Contributed by Gerald Manipon.Prefork: Limits for child process resident memory size.=======================================================This version introduces the new :setting:`worker_max_memory_per_child` setting,which BLA BLA BLA# 5cae0e754128750a893524dcba4ae030c414de33Contributed by Dave Smith.Redis: New optimized chord join implementation.===============================================This was an experimental feature introduced in Celery 3.1,but is now enabled by default.?new_join BLABLABLARiak Result Backend===================Contributed by Gilles Dartiguelongue, Alman One and NoKriK.Bla bla- blah blahCouchDB Result Backend======================Contributed by Nathan Van GheemNew Cassandra Backend=====================The new Cassandra backend utilizes the python-driver library.Old backend is deprecated and everyone using cassandra is required to upgradeto be using the new driver.# XXX What changed?Event Batching==============Events are now buffered in the worker and sent as a list, andevents are sent as transient messages by default so that they are not writtento disk by RabbitMQ.03399b4d7c26fb593e61acf34f111b66b340ba4eTask.replace============Task.replace changed, removes Task.replace_in_chord.The two methods had almost the same functionality, but the old Task.replacewould force the new task to inherit the callbacks/errbacks of the existingtask.If you replace a node in a tree, then you would not expect the new node toinherit the children of the old node, so this seems like unexpectedbehavior.So self.replace(sig) now works for any task, in addition sig can nowbe a group.Groups are automatically converted to a chord, where the callbackwill "accumulate" the results of the group tasks.A new builtin task (`celery.accumulate` was added for this purpose)Closes #817Optimized Beat implementation=============================heapq20340d79b55137643d5ac0df063614075385daaaContributed by Ask Solem and Alexander Koshelev.Task Autoretry Decorator========================75246714dd11e6c463b9dc67f4311690643bff24Contributed by Dmitry Malinovsky.In Other News-------------- **Requirements**:    - Now depends on :ref:`Kombu 3.1 <kombu:version-3.1.0>`.    - Now depends on :mod:`billiard` version 3.4.    - No longer depends on ``anyjson`` :sadface:- **Programs**: ``%n`` format for :program:`celery multi` is now synonym with  ``%N`` to be consistent with :program:`celery worker`.- **Programs**: celery inspect/control now supports ``--json`` argument to  give output in json format.- **Programs**: :program:`celery inspect registered` now ignores built-in  tasks.- **Programs**: New :program:`celery logtool`: Utility for filtering and parsing  celery worker logfiles- **Redis Transport**: The Redis transport now supports the  :setting:`broker_use_ssl` option.- **Worker**: Worker now only starts the remote control command consumer if the  broker transport used actually supports them.- **Worker**: Gossip now sets ``x-message-ttl`` for event queue to heartbeat_interval s.  (Issue #2005).- **Worker**: Now preserves exit code (Issue #2024).- **Worker**: Loglevel for unrecoverable errors changed from ``error`` to  ``critical``.- **Worker**: Improved rate limiting accuracy.- **Worker**: Account for missing timezone information in task expires field.    Fix contributed by Albert Wang.- **Worker**: The worker no longer has a ``Queues`` bootsteps, as it is now    superfluous.- **Tasks**: New :setting:`task_reject_on_worker_lost` setting, and  :attr:`~@Task.reject_on_worker_lost` task attribute decides what happens  when the child worker process executing a late ack task is terminated.    Contributed by Michael Permana.- **App**: New signals for app configuration/finalization:    - :data:`app.on_configure <@on_configure>`    - :data:`app.on_after_configure <@on_after_configure>`    - :data:`app.on_after_finalize <@on_after_finalize>`- **Task**: New task signals for rejected task messages:    - :data:`celery.signals.task_rejected`.    - :data:`celery.signals.task_unknown`.- **Events**: Event messages now uses the RabbitMQ ``x-message-ttl`` option    to ensure older event messages are discarded.    The default is 5 seconds, but can be changed using the    :setting:`event_queue_ttl` setting.- **Events**: Event monitors now sets the :setting:`event_queue_expires`  setting by default.    The queues will now expire after 60 seconds after the monitor stops    consuming from it.- **Canvas**: ``chunks``/``map``/``starmap`` are now routed based on the target task.- **Canvas**: ``Signature.link`` now works when argument is scalar (not a list)    (Issue #2019).- **App**: The application can now change how task names are generated using    the :meth:`~@gen_task_name` method.    Contributed by Dmitry Malinovsky.- **Tasks**: ``Task.subtask`` renamed to ``Task.signature`` with alias.- **Tasks**: ``Task.subtask_from_request`` renamed to  ``Task.signature_from_request`` with alias.- **Tasks**: The ``delivery_mode`` attribute for :class:`kombu.Queue` is now  respected (Issue #1953).- **Tasks**: Routes in :setting:`task-routes` can now specify a  :class:`~kombu.Queue` instance directly.    Example:    .. code-block:: python        task_routes = {'proj.tasks.add': {'queue': Queue('add')}}- **Tasks**: ``AsyncResult`` now raises :exc:`ValueError` if task_id is None.  (Issue #1996).- **Tasks**: ``result.get()`` now supports an ``on_message`` argument to set a  callback to be called for every message received.- **Tasks**: New abstract classes added:    - :class:`~celery.utils.abstract.CallableTask`        Looks like a task.    - :class:`~celery.utils.abstract.CallableSignature`        Looks like a task signature.- **Programs**: :program:`celery multi` now passes through `%i` and `%I` log  file formats.- **Programs**: A new command line option :option:``--executable`` is now  available for daemonizing programs.    Contributed by Bert Vanderbauwhede.- **Programs**: :program:`celery worker` supports new  :option:`--prefetch-multiplier` option.    Contributed by Mickaël Penhard.- **Prefork**: Prefork pool now uses ``poll`` instead of ``select`` where  available (Issue #2373).- **Tasks**: New :setting:`email_charset` setting allows for changing  the charset used for outgoing error emails.    Contributed by Vladimir Gorbunov.- **Worker**: Now respects :setting:`broker_connection_retry` setting.    Fix contributed by Nat Williams.- **Worker**: Autoscale did not always update keepalive when scaling down.    Fix contributed by Philip Garnero.- **General**: Dates are now always timezone aware even if  :setting:`enable_utc` is disabled (Issue #943).    Fix contributed by Omer Katz.- **Result Backends**: The redis result backend now has a default socket   timeout of 5 seconds.    The default can be changed using the new :setting:`redis_socket_timeout`    setting.    Contributed by Raghuram Srinivasan.- **Result Backends**: RPC Backend result queues are now auto delete by  default (Issue #2001).- **Result Backends**: MongoDB now supports setting the  :setting:`result_serialzier` setting to ``bson`` to use the MongoDB  libraries own serializer.    Contributed by Davide Quarta.- **Result Backends**: SQLAlchemy result backend now ignores all result   engine options when using NullPool (Issue #1930).- **Result Backends**: MongoDB URI handling has been improved to use    database name, user and password from the URI if provided.    Contributed by Samuel Jaillet.- **Result Backends**: Fix problem with rpc/amqp backends where exception    was not deserialized properly with the json serializer (Issue #2518).    Fix contributed by Allard Hoeve.- **General**: All Celery exceptions/warnings now inherit from common  :class:`~celery.exceptions.CeleryException`/:class:`~celery.exceptions.CeleryWarning`.  (Issue #2643).- **Tasks**: Task retry now also throws in eager mode.    Fix contributed by Feanil Patel.- Apps can now define how tasks are named (:meth:`@gen_task_name`).    Contributed by Dmitry Malinovsky- Module ``celery.worker.job`` renamed to :mod:`celery.worker.request`.- Beat: ``Scheduler.Publisher``/``.publisher`` renamed to  ``.Producer``/``.producer``.Unscheduled Removals====================- The experimental :mod:`celery.contrib.methods` feature has been removed,  as there were far many bugs in the implementation to be useful.- The CentOS init scripts have been removed.    These did not really add any features over the generic init scripts,    so you are encouraged to use them instead, or something like    ``supervisord``... _v320-removals:Scheduled Removals==================Modules-------- Module ``celery.worker.job`` has been renamed to :mod:`celery.worker.request`.    This was an internal module so should not have any effect.    It is now part of the public API so should not change again.- Module ``celery.task.trace`` has been renamed to ``celery.app.trace``  as the ``celery.task`` package is being phased out.  The compat module  will be removed in version 4.0 so please change any import from::    from celery.task.trace import …  to::    from celery.app.trace import …- Old compatibility aliases in the :mod:`celery.loaders` module  has been removed.    - Removed ``celery.loaders.current_loader()``, use: ``current_app.loader``    - Removed ``celery.loaders.load_settings()``, use: ``current_app.conf``Result------- ``AsyncResult.serializable()`` and ``celery.result.from_serializable``    has been removed:    Use instead:    .. code-block:: pycon        >>> tup = result.as_tuple()        >>> from celery.result import result_from_tuple        >>> result = result_from_tuple(tup)- Removed ``BaseAsyncResult``, use ``AsyncResult`` for instance checks  instead.- Removed ``TaskSetResult``, use ``GroupResult`` instead.    - ``TaskSetResult.total`` -> ``len(GroupResult)``    - ``TaskSetResult.taskset_id`` -> ``GroupResult.id``TaskSet-------TaskSet has been renamed to group and TaskSet will be removed in version 4.0.Old::    >>> from celery.task import TaskSet    >>> TaskSet(add.subtask((i, i)) for i in xrange(10)).apply_async()New::    >>> from celery import group    >>> group(add.s(i, i) for i in xrange(10))()Magic keyword arguments-----------------------Support for the very old magic keyword arguments accepted by tasks has finallybeen in 4.0.If you are still using these you have to rewrite any task stillusing the old ``celery.decorators`` module and dependingon keyword arguments being passed to the task,for example::    from celery.decorators import task    @task()    def add(x, y, task_id=None):        print("My task id is %r" % (task_id,))should be rewritten into::    from celery import task    @task(bind=True)    def add(self, x, y):        print("My task id is {0.request.id}".format(self))Settings--------The following settings have been removed, and is no longer supported:Logging Settings~~~~~~~~~~~~~~~~=====================================  =====================================**Setting name**                       **Replace with**=====================================  =====================================``CELERYD_LOG_LEVEL``                  :option:`--loglevel```CELERYD_LOG_FILE``                   :option:`--logfile````CELERYBEAT_LOG_LEVEL``               :option:`--loglevel```CELERYBEAT_LOG_FILE``                :option:`--loglevel````CELERYMON_LOG_LEVEL``                celerymon is deprecated, use flower.``CELERYMON_LOG_FILE``                 celerymon is deprecated, use flower.``CELERYMON_LOG_FORMAT``               celerymon is deprecated, use flower.=====================================  =====================================Task Settings~~~~~~~~~~~~~~=====================================  =====================================**Setting name**                       **Replace with**=====================================  =====================================``CELERY_CHORD_PROPAGATES``            N/a=====================================  =====================================.. _v320-deprecations:Deprecations============See the :ref:`deprecation-timeline`... _v320-fixes:Fixes=====
 |