whatsnew-4.0.rst 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322
  1. .. _whatsnew-4.0:
  2. ===========================================
  3. What's new in Celery 4.0 (0Today8)
  4. ===========================================
  5. :Author: Ask Solem (``ask at celeryproject.org``)
  6. .. sidebar:: Change history
  7. What's new documents describe the changes in major versions,
  8. we also have a :ref:`changelog` that lists the changes in bugfix
  9. releases (0.0.x), while older series are archived under the :ref:`history`
  10. section.
  11. Celery is a simple, flexible and reliable distributed system to
  12. process vast amounts of messages, while providing operations with
  13. the tools required to maintain such a system.
  14. It's a task queue with focus on real-time processing, while also
  15. supporting task scheduling.
  16. Celery has a large and diverse community of users and contributors,
  17. you should come join us :ref:`on IRC <irc-channel>`
  18. or :ref:`our mailing-list <mailing-list>`.
  19. To read more about Celery you should go read the :ref:`introduction <intro>`.
  20. While this version is backward compatible with previous versions
  21. it's important that you read the following section.
  22. This version is officially supported on CPython 2.7, 3.4 and 3.5.
  23. and also supported on PyPy.
  24. .. _`website`: http://celeryproject.org/
  25. .. topic:: Table of Contents
  26. Make sure you read the important notes before upgrading to this version.
  27. .. contents::
  28. :local:
  29. :depth: 2
  30. Preface
  31. =======
  32. Wall of Contributors
  33. --------------------
  34. Aaron McMillin, Adam Renberg, Adrien Guinet, Ahmet Demir, Aitor Gómez-Goiri,
  35. Albert Wang, Alex Koshelev, Alex Rattray, Alex Williams, Alexander Koshelev,
  36. Alexander Lebedev, Alexander Oblovatniy, Alexey Kotlyarov, Ali Bozorgkhan,
  37. Alice Zoë Bevan–McGregor, Allard Hoeve, Alman One, Andrea Rabbaglietti,
  38. Andrea Rosa, Andrei Fokau, Andrew Rodionoff, Andriy Yurchuk,
  39. Aneil Mallavarapu, Areski Belaid, Artyom Koval, Ask Solem, Balthazar Rouberol,
  40. Berker Peksag, Bert Vanderbauwhede, Brian Bouterse, Chris Duryee, Chris Erway,
  41. Chris Harris, Chris Martin, Corey Farwell, Craig Jellick, Cullen Rhodes,
  42. Dallas Marlow, Daniel Wallace, Danilo Bargen, Davanum Srinivas, Dave Smith,
  43. David Baumgold, David Harrigan, David Pravec, Dennis Brakhane, Derek Anderson,
  44. Dmitry Malinovsky, Dudás Ádám, Dustin J. Mitchell, Ed Morley, Fatih Sucu,
  45. Feanil Patel, Felix Schwarz, Fernando Rocha, Flavio Grossi, Frantisek Holop,
  46. Gao Jiangmiao, Gerald Manipon, Gilles Dartiguelongue, Gino Ledesma,
  47. Hank John, Hogni Gylfason, Ilya Georgievsky, Ionel Cristian Mărieș,
  48. James Pulec, Jared Lewis, Jason Veatch, Jasper Bryant-Greene, Jeremy Tillman,
  49. Jocelyn Delalande, Joe Jevnik, John Anderson, John Kirkham, John Whitlock,
  50. Joshua Harlow, Juan Rossi, Justin Patrin, Kai Groner, Kevin Harvey,
  51. Konstantinos Koukopoulos, Kouhei Maeda, Kracekumar Ramaraju,
  52. Krzysztof Bujniewicz, Latitia M. Haskins, Len Buckens, Lorenzo Mancini,
  53. Lucas Wiman, Luke Pomfrey, Marcio Ribeiro, Marin Atanasov Nikolov,
  54. Mark Parncutt, Maxime Vdb, Mher Movsisyan, Michael (:github_user:`michael-k`),
  55. Michael Duane Mooring, Michael Permana, Mickaël Penhard, Mike Attwood,
  56. Morton Fox, Môshe van der Sterre, Nat Williams, Nathan Van Gheem, Nik Nyby,
  57. Omer Katz, Omer Korner, Ori Hoch, Paul Pearce, Paulo Bu, Philip Garnero,
  58. Piotr Maślanka, Radek Czajka, Raghuram Srinivasan, Randy Barlow,
  59. Rodolfo Carvalho, Roger Hu, Rongze Zhu, Ross Deane, Ryan Luckie,
  60. Rémy Greinhofer, Samuel Jaillet, Sergey Azovskov, Sergey Tikhonov,
  61. Seungha Kim, Steve Peak, Sukrit Khera, Tadej Janež, Tewfik Sadaoui,
  62. Thomas French, Thomas Grainger, Tobias Schottdorf, Tocho Tochev,
  63. Valentyn Klindukh, Vic Kumar, Vladimir Bolshakov, Vladimir Gorbunov,
  64. Wayne Chang, Wil Langford, Will Thompson, William King, Yury Selivanov,
  65. Zoran Pavlovic, 許邱翔, :github_user:`allenling`, :github_user:`bee-keeper`,
  66. :github_user:`ffeast`, :github_user:`flyingfoxlee`, :github_user:`gdw2`,
  67. :github_user:`gitaarik`, :github_user:`hankjin`, :github_user:`m-vdb`,
  68. :github_user:`mdk`, :github_user:`nokrik`, :github_user:`ocean1`,
  69. :github_user:`orlo666`, :github_user:`raducc`, :github_user:`wanglei`,
  70. :github_user:`worldexception`.
  71. .. _v400-important:
  72. Important Notes
  73. ===============
  74. Dropped support for Python 2.6
  75. ------------------------------
  76. Celery now requires Python 2.7 or later,
  77. and also drops support for Python 3.3 so supported versions are:
  78. - CPython 2.7
  79. - CPython 3.4
  80. - CPython 3.5
  81. - PyPy 4.0 (``pypy2``)
  82. - PyPy 2.4 (``pypy3``)
  83. - Jython 2.7.0
  84. Last major version to support Python 2
  85. --------------------------------------
  86. Starting from Celery 5.0 only Python 3.6+ will be supported.
  87. To make sure you're not affected by this change you should pin
  88. the Celery version in your requirements file, either to a specific
  89. version: ``celery==4.0.0``, or a range: ``celery>=4.0,<5.0``.
  90. Dropping support for Python 2 will enable us to remove massive
  91. amounts of compatibility code, and going with Python 3.6 allows
  92. us to take advantage of typing, async/await, asyncio, ++, for which
  93. there are no convenient alternatives in older versions.
  94. Celery 4.x will continue to work on Python 2.7, 3.4, 3.5; just as Celery 3.x
  95. still works on Python 2.6.
  96. Lowercase setting names
  97. -----------------------
  98. In the pursuit of beauty all settings have been renamed to be in all
  99. lowercase, and some setting names have been renamed for naming consistency.
  100. This change is fully backwards compatible so you can still use the uppercase
  101. setting names, but we would like you to upgrade as soon as possible and
  102. you can even do so automatically using the :program:`celery upgrade settings`
  103. command:
  104. .. code-block:: console
  105. $ celery upgrade settings proj/settings.py
  106. This command will modify your module in-place to use the new lower-case
  107. names (if you want uppercase with a celery prefix see block below),
  108. and save a backup in :file:`proj/settings.py.orig`.
  109. .. admonition:: For Django users and others who want to keep uppercase names
  110. If you're loading Celery configuration from the Django settings module
  111. then you will want to keep using the uppercase names.
  112. You will also want to use a ``CELERY_`` prefix so that no Celery settings
  113. collide with Django settings used by other apps.
  114. To do this, you will first need to convert your settings file
  115. to use the new consistent naming scheme, and add the prefix to all
  116. Celery related settings:
  117. .. code-block:: console
  118. $ celery upgrade settings --django proj/settings.py
  119. After upgrading the settings file, you need to set the prefix explicitly
  120. in your ``proj/celery.py`` module:
  121. .. code-block:: python
  122. app.config_from_object('django.conf:settings', namespace='CELERY')
  123. You can find the most up to date Django celery integration example
  124. here: :ref:`django-first-steps`.
  125. Note that this will also add a prefix to settings that didn't previously
  126. have one, like ``BROKER_URL``.
  127. Luckily you don't have to manually change the files, as
  128. the :program:`celery upgrade settings --django` program should do the
  129. right thing.
  130. The loader will try to detect if your configuration is using the new format,
  131. and act accordingly, but this also means that you are not allowed to mix and
  132. match new and old setting names, that is unless you provide a value for both
  133. alternatives.
  134. The major difference between previous versions, apart from the lower case
  135. names, are the renaming of some prefixes, like ``celerybeat_`` to ``beat_``,
  136. ``celeryd_`` to ``worker_``.
  137. The ``celery_`` prefix has also been removed, and task related settings
  138. from this name-space is now prefixed by ``task_``, worker related settings
  139. with ``worker_``.
  140. Apart from this most of the settings will be the same in lowercase, apart from
  141. a few special ones:
  142. ===================================== ==========================================================
  143. **Setting name** **Replace with**
  144. ===================================== ==========================================================
  145. ``CELERY_MAX_CACHED_RESULTS`` :setting:`result_cache_max`
  146. ``CELERY_MESSAGE_COMPRESSION`` :setting:`result_compression`/:setting:`task_compression`.
  147. ``CELERY_TASK_RESULT_EXPIRES`` :setting:`result_expires`
  148. ``CELERY_RESULT_DBURI`` :setting:`sqlalchemy_dburi`
  149. ``CELERY_RESULT_ENGINE_OPTIONS`` :setting:`sqlalchemy_engine_options`
  150. ``-*-_DB_SHORT_LIVED_SESSIONS`` :setting:`sqlalchemy_short_lived_sessions`
  151. ``CELERY_RESULT_DB_TABLE_NAMES`` :setting:`sqlalchemy_db_names`
  152. ``CELERY_ACKS_LATE`` :setting:`task_acks_late`
  153. ``CELERY_ALWAYS_EAGER`` :setting:`task_always_eager`
  154. ``CELERY_ANNOTATIONS`` :setting:`task_annotations`
  155. ``CELERY_MESSAGE_COMPRESSION`` :setting:`task_compression`
  156. ``CELERY_CREATE_MISSING_QUEUES`` :setting:`task_create_missing_queues`
  157. ``CELERY_DEFAULT_DELIVERY_MODE`` :setting:`task_default_delivery_mode`
  158. ``CELERY_DEFAULT_EXCHANGE`` :setting:`task_default_exchange`
  159. ``CELERY_DEFAULT_EXCHANGE_TYPE`` :setting:`task_default_exchange_type`
  160. ``CELERY_DEFAULT_QUEUE`` :setting:`task_default_queue`
  161. ``CELERY_DEFAULT_RATE_LIMIT`` :setting:`task_default_rate_limit`
  162. ``CELERY_DEFAULT_ROUTING_KEY`` :setting:`task_default_routing_key`
  163. ``-"-_EAGER_PROPAGATES_EXCEPTIONS`` :setting:`task_eager_propagates`
  164. ``CELERY_IGNORE_RESULT`` :setting:`task_ignore_result`
  165. ``CELERY_TASK_PUBLISH_RETRY`` :setting:`task_publish_retry`
  166. ``CELERY_TASK_PUBLISH_RETRY_POLICY`` :setting:`task_publish_retry_policy`
  167. ``CELERY_QUEUES`` :setting:`task_queues`
  168. ``CELERY_ROUTES`` :setting:`task_routes`
  169. ``CELERY_SEND_TASK_ERROR_EMAILS`` :setting:`task_send_error_emails`
  170. ``CELERY_SEND_TASK_SENT_EVENT`` :setting:`task_send_sent_event`
  171. ``CELERY_TASK_SERIALIZER`` :setting:`task_serializer`
  172. ``CELERYD_TASK_SOFT_TIME_LIMIT`` :setting:`task_soft_time_limit`
  173. ``CELERYD_TASK_TIME_LIMIT`` :setting:`task_time_limit`
  174. ``CELERY_TRACK_STARTED`` :setting:`task_track_started`
  175. ``CELERY_DISABLE_RATE_LIMITS`` :setting:`worker_disable_rate_limits`
  176. ``CELERY_ENABLE_REMOTE_CONTROL`` :setting:`worker_enable_remote_control`
  177. ``CELERYD_SEND_EVENTS`` :setting:`worker_send_task_events`
  178. ===================================== ==========================================================
  179. You can see a full table of the changes in :ref:`conf-old-settings-map`.
  180. JSON is now the default serializer
  181. ----------------------------------
  182. The time has finally come to end the reign of :mod:`pickle` as the default
  183. serialization mechanism, and json is the default serializer starting from this
  184. version.
  185. This change was :ref:`announced with the release of Celery 3.1
  186. <last-version-to-enable-pickle>`.
  187. If you're still depending on :mod:`pickle` being the default serializer,
  188. then you have to configure your app before upgrading to 4.0:
  189. .. code-block:: python
  190. task_serializer = 'pickle'
  191. result_serializer = 'pickle'
  192. accept_content = {'pickle'}
  193. The Task base class no longer automatically register tasks
  194. ----------------------------------------------------------
  195. The :class:`~@Task` class is no longer using a special meta-class
  196. that automatically registers the task in the task registry.
  197. Instead this is now handled by the :class:`@task` decorators.
  198. If you're still using class based tasks, then you need to register
  199. these manually:
  200. .. code-block:: python
  201. class CustomTask(Task):
  202. def run(self):
  203. print('running')
  204. app.tasks.register(CustomTask())
  205. The best practice is to use custom task classes only for overriding
  206. general behavior, and then using the task decorator to realize the task:
  207. .. code-block:: python
  208. @app.task(bind=True, base=CustomTask)
  209. def custom(self):
  210. print('running')
  211. This change also means the ``abstract`` attribute of the task
  212. no longer has any effect.
  213. Task argument checking
  214. ----------------------
  215. The arguments of the task is now verified when calling the task,
  216. even asynchronously:
  217. .. code-block:: pycon
  218. >>> @app.task
  219. ... def add(x, y):
  220. ... return x + y
  221. >>> add.delay(8, 8)
  222. <AsyncResult: f59d71ca-1549-43e0-be41-4e8821a83c0c>
  223. >>> add.delay(8)
  224. Traceback (most recent call last):
  225. File "<stdin>", line 1, in <module>
  226. File "celery/app/task.py", line 376, in delay
  227. return self.apply_async(args, kwargs)
  228. File "celery/app/task.py", line 485, in apply_async
  229. check_arguments(*(args or ()), **(kwargs or {}))
  230. TypeError: add() takes exactly 2 arguments (1 given)
  231. Redis Events not backward compatible
  232. ------------------------------------
  233. The Redis ``fanout_patterns`` and ``fanout_prefix`` transport
  234. options are now enabled by default, which means that workers
  235. running 4.0 cannot see workers running 3.1 on the default configuration,
  236. and vice versa.
  237. This is only related to monitor event messages, the workers should still
  238. execute tasks as normally.
  239. You can avoid this situation by configuring the 3.1 workers (and clients)
  240. to enable these settings, before upgrading to 4.0:
  241. .. code-block:: python
  242. BROKER_TRANSPORT_OPTIONS = {
  243. 'fanout_patterns': True,
  244. 'fanout_prefix': True,
  245. }
  246. Django: Auto-discover now supports Django app configurations
  247. ------------------------------------------------------------
  248. The :meth:`@autodiscover` function can now be called without arguments,
  249. and the Django handler will automatically find your installed apps:
  250. .. code-block:: python
  251. app.autodiscover()
  252. The Django integration :ref:`example in the documentation
  253. <django-first-steps>` has been updated to use the argument-less call.
  254. Worker direct queues no longer use auto-delete.
  255. ===============================================
  256. Workers/clients running 4.0 will no longer be able to send
  257. worker direct messages to worker running older versions, and vice versa.
  258. If you're relying on worker direct messages you should upgrade
  259. your 3.x workers and clients to use the new routing settings first,
  260. by replacing :func:`celery.utils.worker_direct` with this implementation:
  261. .. code-block:: python
  262. from kombu import Exchange, Queue
  263. worker_direct_exchange = Exchange('C.dq2')
  264. def worker_direct(hostname):
  265. return Queue(
  266. '{hostname}.dq2'.format(hostname),
  267. exchange=worker_direct_exchange,
  268. routing_key=hostname,
  269. )
  270. (This feature closed Issue #2492.)
  271. Old command-line programs removed
  272. ---------------------------------
  273. Installing Celery will no longer install the ``celeryd``,
  274. ``celerybeat`` and ``celeryd-multi`` programs.
  275. This was announced with the release of Celery 3.1, but you may still
  276. have scripts pointing to the old names so make sure you update these
  277. to use the new umbrella command:
  278. +-------------------+--------------+-------------------------------------+
  279. | Program | New Status | Replacement |
  280. +===================+==============+=====================================+
  281. | ``celeryd`` | **REMOVED** | :program:`celery worker` |
  282. +-------------------+--------------+-------------------------------------+
  283. | ``celerybeat`` | **REMOVED** | :program:`celery beat` |
  284. +-------------------+--------------+-------------------------------------+
  285. | ``celeryd-multi`` | **REMOVED** | :program:`celery multi` |
  286. +-------------------+--------------+-------------------------------------+
  287. .. _v400-news:
  288. News
  289. ====
  290. New Task Message Protocol
  291. =========================
  292. .. :sha:`e71652d384b1b5df2a4e6145df9f0efb456bc71c`
  293. This version introduces a brand new task message protocol,
  294. the first major change to the protocol since the beginning of the project.
  295. The new protocol is backwards incompatible, so you need to set
  296. the :setting:`task_protocol` configuration option to ``2`` to take advantage:
  297. .. code-block:: python
  298. app = Celery()
  299. app.conf.task_protocol = 2
  300. Using the new protocol is recommended for everybody who don't
  301. need backwards compatibility.
  302. Once enabled task messages sent is unreadable to older versions of Celery.
  303. New protocol highlights
  304. -----------------------
  305. The new protocol fixes many problems with the old one, and enables
  306. some long-requested features:
  307. - Most of the data are now sent as message headers, instead of being
  308. serialized with the message body.
  309. In version 1 of the protocol the worker always had to deserialize
  310. the message to be able to read task meta-data like the task id,
  311. name, etc. This also meant that the worker was forced to double-decode
  312. the data, first deserializing the message on receipt, serializing
  313. the message again to send to child process, then finally the child process
  314. deserializes the message again.
  315. Keeping the meta-data fields in the message headers means the worker
  316. does not actually have to decode the payload before delivering
  317. the task to the child process, and also that it's now possible
  318. for the worker to reroute a task written in a language different
  319. from Python to a different worker.
  320. - A new ``lang`` message header can be used to specify the programming
  321. language the task is written in.
  322. - Worker stores results for internal errors like ``ContentDisallowed``,
  323. and other deserialization errors.
  324. - Worker stores results and sends monitoring events for unregistered
  325. task errors.
  326. - Worker calls callbacks/errbacks even when the result is sent by the
  327. parent process (e.g. :exc:`WorkerLostError` when a child process
  328. terminates, deserialization errors, unregistered tasks).
  329. - A new ``origin`` header contains information about the process sending
  330. the task (worker node-name, or PID and host-name information).
  331. - A new ``shadow`` header allows you to modify the task name used in logs.
  332. This is useful for dispatch like patterns, like a task that calls
  333. any function using pickle (don't do this at home):
  334. .. code-block:: python
  335. from celery import Task
  336. from celery.utils.imports import qualname
  337. class call_as_task(Task):
  338. def shadow_name(self, args, kwargs, options):
  339. return 'call_as_task:{0}'.format(qualname(args[0]))
  340. def run(self, fun, *args, **kwargs):
  341. return fun(*args, **kwargs)
  342. call_as_task = app.tasks.register(call_as_task())
  343. - New ``argsrepr`` and ``kwargsrepr`` fields contain textual representations
  344. of the task arguments (possibly truncated) for use in logs, monitors, etc.
  345. This means the worker does not have to deserialize the message payload
  346. to display the task arguments for informational purposes.
  347. - Chains now use a dedicated ``chain`` field enabling support for chains
  348. of thousands and more tasks.
  349. - New ``parent_id`` and ``root_id`` headers adds information about
  350. a tasks relationship with other tasks.
  351. - ``parent_id`` is the task id of the task that called this task
  352. - ``root_id`` is the first task in the work-flow.
  353. These fields can be used to improve monitors like flower to group
  354. related messages together (like chains, groups, chords, complete
  355. work-flows, etc).
  356. - ``app.TaskProducer`` replaced by :meth:`@amqp.create_task_message`` and
  357. :meth:`@amqp.send_task_message``.
  358. Dividing the responsibilities into creating and sending means that
  359. people who want to send messages using a Python AMQP client directly,
  360. does not have to implement the protocol.
  361. The :meth:`@amqp.create_task_message` method calls either
  362. :meth:`@amqp.as_task_v2`, or :meth:`@amqp.as_task_v1` depending
  363. on the configured task protocol, and returns a special
  364. :class:`~celery.app.amqp.task_message` tuple containing the
  365. headers, properties and body of the task message.
  366. .. seealso::
  367. The new task protocol is documented in full here:
  368. :ref:`message-protocol-task-v2`.
  369. Prefork: Tasks now log from the child process
  370. =============================================
  371. Logging of task success/failure now happens from the child process
  372. actually executing the task, which means that logging utilities
  373. like Sentry can get full information about tasks that fail, including
  374. variables in the traceback.
  375. Prefork: One log-file per child process
  376. =======================================
  377. Init-scrips and :program:`celery multi` now uses the `%I` log file format
  378. option (e.g. :file:`/var/log/celery/%n%I.log`).
  379. This change was necessary to ensure each child
  380. process has a separate log file after moving task logging
  381. to the child process, as multiple processes writing to the same
  382. log file can cause corruption.
  383. You are encouraged to upgrade your init-scripts and
  384. :program:`celery multi` arguments to use this new option.
  385. Configure broker URL for read/write separately.
  386. ===============================================
  387. New :setting:`broker_read_url` and :setting:`broker_write_url` settings
  388. have been added so that separate broker URLs can be provided
  389. for connections used for consuming/publishing.
  390. In addition to the configuration options, two new methods have been
  391. added the app API:
  392. - ``app.connection_for_read()``
  393. - ``app.connection_for_write()``
  394. These should now be used in place of ``app.connection()`` to specify
  395. the intent of the required connection.
  396. .. note::
  397. Two connection pools are available: ``app.pool`` (read), and
  398. ``app.producer_pool`` (write). The latter does not actually give connections
  399. but full :class:`kombu.Producer` instances.
  400. .. code-block:: python
  401. def publish_some_message(app, producer=None):
  402. with app.producer_or_acquire(producer) as producer:
  403. ...
  404. def consume_messages(app, connection=None):
  405. with app.connection_or_acquire(connection) as connection:
  406. ...
  407. Canvas Refactor
  408. ===============
  409. The canvas/work-flow implementation have been heavily refactored
  410. to fix some long outstanding issues.
  411. .. :sha:`d79dcd8e82c5e41f39abd07ffed81ca58052bcd2`
  412. .. :sha:`1e9dd26592eb2b93f1cb16deb771cfc65ab79612`
  413. .. :sha:`e442df61b2ff1fe855881c1e2ff9acc970090f54`
  414. .. :sha:`0673da5c09ac22bdd49ba811c470b73a036ee776`
  415. - Now unrolls groups within groups into a single group (Issue #1509).
  416. - chunks/map/starmap tasks now routes based on the target task
  417. - chords and chains can now be immutable.
  418. - Fixed bug where serialized signatures were not converted back into
  419. signatures (Issue #2078)
  420. Fix contributed by Ross Deane.
  421. - Fixed problem where chains and groups did not work when using JSON
  422. serialization (Issue #2076).
  423. Fix contributed by Ross Deane.
  424. - Creating a chord no longer results in multiple values for keyword
  425. argument 'task_id' (Issue #2225).
  426. Fix contributed by Aneil Mallavarapu
  427. - Fixed issue where the wrong result is returned when a chain
  428. contains a chord as the penultimate task.
  429. Fix contributed by Aneil Mallavarapu
  430. - Special case of ``group(A.s() | group(B.s() | C.s()))`` now works.
  431. - Chain: Fixed bug with incorrect id set when a subtask is also a chain.
  432. - ``group | group`` is now flattened into a single group (Issue #2573).
  433. - Fixed issue where ``group | task`` was not upgrading correctly
  434. to chord (Issue #2922).
  435. Amazon SQS transport now officially supported.
  436. ==============================================
  437. The SQS broker transport has been rewritten to use async I/O and as such
  438. joins RabbitMQ and Redis as officially supported transports.
  439. The new implementation also takes advantage of long polling,
  440. and closes several issues related to using SQS as a broker.
  441. This work was sponsored by Nextdoor.
  442. Schedule tasks based on sunrise, sunset, dawn and dusk.
  443. =======================================================
  444. See :ref:`beat-solar` for more information.
  445. Contributed by Mark Parncutt.
  446. New API for configuring periodic tasks
  447. ======================================
  448. This new API enables you to use signatures when defining periodic tasks,
  449. removing the chance of mistyping task names.
  450. An example of the new API is :ref:`here <beat-entries>`.
  451. .. :sha:`bc18d0859c1570f5eb59f5a969d1d32c63af764b`
  452. .. :sha:`132d8d94d38f4050db876f56a841d5a5e487b25b`
  453. RabbitMQ Priority queue support
  454. ===============================
  455. See :ref:`routing-options-rabbitmq-priorities` for more information.
  456. Contributed by Gerald Manipon.
  457. Prefork: Limit child process resident memory size.
  458. ==================================================
  459. .. :sha:`5cae0e754128750a893524dcba4ae030c414de33`
  460. You can now limit the maximum amount of memory allocated per prefork
  461. pool child process by setting the worker
  462. :option:`--maxmemperchild <celery worker --maxmemperchild>` option,
  463. or the :setting:`worker_max_memory_per_child` setting.
  464. The limit is for RSS/resident memory size and is specified in kilobytes.
  465. A child process having exceeded the limit will be terminated and replaced
  466. with a new process after the currently executing task returns.
  467. See :ref:`worker-maxmemperchild` for more information.
  468. Contributed by Dave Smith.
  469. Redis: Result backend optimization
  470. ==================================
  471. RPC is now using pub/sub for streaming task results.
  472. ----------------------------------------------------
  473. Calling ``result.get()`` when using the Redis result backend
  474. used to be extremely expensive as it was using polling to wait
  475. for the result to become available. A default polling
  476. interval of 0.5 seconds did not help performance, but was
  477. necessary to avoid a spin loop.
  478. The new implementation is using Redis Pub/Sub mechanisms to
  479. publish and retrieve results immediately, greatly improving
  480. task round-trip times.
  481. Contributed by Yaroslav Zhavoronkov and Ask Solem.
  482. New optimized chord join implementation.
  483. ----------------------------------------
  484. This was an experimental feature introduced in Celery 3.1,
  485. that could only be enabled by adding ``?new_join=1`` to the
  486. result backend URL configuration.
  487. We feel that the implementation has been tested thoroughly enough
  488. to be considered stable and enabled by default.
  489. The new implementation greatly reduces the overhead of chords,
  490. and especially with larger chords the performance benefit can be massive.
  491. New Riak result backend Introduced.
  492. ===================================
  493. See :ref:`conf-riak-result-backend` for more information.
  494. Contributed by Gilles Dartiguelongue, Alman One and NoKriK.
  495. New CouchDB result backend introduced.
  496. ======================================
  497. See :ref:`conf-couchdb-result-backend` for more information.
  498. Contributed by Nathan Van Gheem
  499. Brand new Cassandra result backend.
  500. ===================================
  501. A brand new Cassandra backend utilizing the new :pypi:`cassandra-driver`
  502. library is replacing the old result backend which was using the older
  503. :pypi:`pycassa` library.
  504. See :ref:`conf-cassandra-result-backend` for more information.
  505. .. # XXX What changed?
  506. New Elasticsearch result backend introduced.
  507. ============================================
  508. See :ref:`conf-elasticsearch-result-backend` for more information.
  509. Contributed by Ahmet Demir.
  510. New File-system result backend introduced.
  511. ==========================================
  512. See :ref:`conf-filesystem-result-backend` for more information.
  513. Contributed by Môshe van der Sterre.
  514. Event Batching
  515. ==============
  516. Events are now buffered in the worker and sent as a list which reduces
  517. the overhead required to send monitoring events.
  518. For authors of custom event monitors there will be no action
  519. required as long as you're using the Python celery
  520. helpers (:class:`~@events.Receiver`) to implement your monitor.
  521. However, if you're manually receiving event messages you must now account
  522. for batched event messages which differ from normal event messages
  523. in the following way:
  524. - The routing key for a batch of event messages will be set to
  525. ``<event-group>.multi`` where the only batched event group
  526. is currently ``task`` (giving a routing key of ``task.multi``).
  527. - The message body will be a serialized list-of-dictionaries instead
  528. of a dictionary. Each item in the list can be regarded
  529. as a normal event message body.
  530. .. :sha:`03399b4d7c26fb593e61acf34f111b66b340ba4e`
  531. Task.replace
  532. ============
  533. Task.replace changed, removes Task.replace_in_chord.
  534. The two methods had almost the same functionality, but the old
  535. ``Task.replace`` would force the new task to inherit the
  536. callbacks/errbacks of the existing task.
  537. If you replace a node in a tree, then you would not expect the new node to
  538. inherit the children of the old node, so this seems like unexpected
  539. behavior.
  540. So ``self.replace(sig)`` now works for any task, in addition ``sig`` can now
  541. be a group.
  542. Groups are automatically converted to a chord, where the callback
  543. will "accumulate" the results of the group tasks.
  544. A new built-in task (`celery.accumulate` was added for this purpose)
  545. Closes #817
  546. Optimized Beat implementation
  547. =============================
  548. The :program:`celery beat` implementation has been optimized
  549. for millions of periodic tasks by using a heap to schedule entries.
  550. Contributed by Ask Solem and Alexander Koshelev.
  551. Task Auto-retry Decorator
  552. =========================
  553. Writing custom retry handling for exception events is so common
  554. that we now have built-in support for it.
  555. For this a new ``autoretry_for`` argument is now supported by
  556. the task decorators, where you can specify a tuple of exceptions
  557. to automatically retry for.
  558. See :ref:`task-autoretry` for more information.
  559. Contributed by Dmitry Malinovsky.
  560. .. :sha:`75246714dd11e6c463b9dc67f4311690643bff24`
  561. Remote Task Tracebacks
  562. ======================
  563. The new :setting:`task_remote_tracebacks` will make task tracebacks more
  564. useful by injecting the stack of the remote worker.
  565. This feature requires the additional :pypi:`tblib` library.
  566. Contributed by Ionel Cristian Mărieș.
  567. Async Result API
  568. ================
  569. eventlet/gevent drainers, promises, BLA BLA
  570. Closed issue #2529.
  571. In Other News
  572. -------------
  573. - **Requirements**:
  574. - Now depends on :ref:`Kombu 4.0 <kombu:version-4.0>`.
  575. - Now depends on :pypi:`billiard` version 3.5.
  576. - No longer depends on :pypi:`anyjson` :(
  577. - **Tasks**: The "anon-exchange" is now used for simple name-name direct routing.
  578. This increases performance as it completely bypasses the routing table,
  579. in addition it also improves reliability for the Redis broker transport.
  580. - **Tasks**: :setting:`task_routes` can now contain glob patterns and
  581. regexes.
  582. See new examples in :setting:`task_routes` and :ref:`routing-automatic`.
  583. - **Eventlet/Gevent**: Fixed race condition leading to "simultaneous read"
  584. errors (Issue #2812).
  585. - **Programs**: ``%n`` format for :program:`celery multi` is now synonym with
  586. ``%N`` to be consistent with :program:`celery worker`.
  587. - **Programs**: celery inspect/control now supports a new
  588. :option:`--json <celery inspect --json>` option to give output in json format.
  589. - **Programs**: :program:`celery inspect registered` now ignores built-in
  590. tasks.
  591. - **Programs**: New :program:`celery logtool`: Utility for filtering and parsing
  592. celery worker log-files
  593. - **Redis Transport**: The Redis transport now supports the
  594. :setting:`broker_use_ssl` option.
  595. - **Worker**: Worker now only starts the remote control command consumer if the
  596. broker transport used actually supports them.
  597. - **Worker**: Gossip now sets ``x-message-ttl`` for event queue to heartbeat_interval s.
  598. (Issue #2005).
  599. - **Worker**: Now preserves exit code (Issue #2024).
  600. - **Worker**: Log--level for unrecoverable errors changed from ``error`` to
  601. ``critical``.
  602. - **Worker**: Improved rate limiting accuracy.
  603. - **Worker**: Account for missing timezone information in task expires field.
  604. Fix contributed by Albert Wang.
  605. - **Worker**: The worker no longer has a ``Queues`` bootsteps, as it is now
  606. superfluous.
  607. - **Tasks**: New :setting:`task_reject_on_worker_lost` setting, and
  608. :attr:`~@Task.reject_on_worker_lost` task attribute decides what happens
  609. when the child worker process executing a late ack task is terminated.
  610. Contributed by Michael Permana.
  611. - **Worker**: Improvements and fixes for LimitedSet
  612. Getting rid of leaking memory + adding ``minlen`` size of the set:
  613. the minimal residual size of the set after operating for some time.
  614. ``minlen`` items are kept, even if they should have been expired.
  615. Problems with older and even more old code:
  616. #. Heap would tend to grow in some scenarios
  617. (like adding an item multiple times).
  618. #. Adding many items fast would not clean them soon enough (if ever).
  619. #. When talking to other workers, revoked._data was sent, but
  620. it was processed on the other side as iterable.
  621. That means giving those keys new (current)
  622. time-stamp. By doing this workers could recycle
  623. items forever. Combined with 1) and 2), this means that in
  624. large set of workers, you are getting out of memory soon.
  625. All those problems should be fixed now.
  626. This should fix issues #3095, #3086.
  627. Contributed by David Pravec.
  628. - **App**: New signals for app configuration/finalization:
  629. - :data:`app.on_configure <@on_configure>`
  630. - :data:`app.on_after_configure <@on_after_configure>`
  631. - :data:`app.on_after_finalize <@on_after_finalize>`
  632. - **Task**: New task signals for rejected task messages:
  633. - :data:`celery.signals.task_rejected`.
  634. - :data:`celery.signals.task_unknown`.
  635. - **Events**: Event messages now uses the RabbitMQ ``x-message-ttl`` option
  636. to ensure older event messages are discarded.
  637. The default is 5 seconds, but can be changed using the
  638. :setting:`event_queue_ttl` setting.
  639. - **Events**: New :setting:`event_queue_prefix` setting can now be used
  640. to change the default ``celeryev`` queue prefix for event receiver queues.
  641. Contributed by Takeshi Kanemoto.
  642. - **Events**: Event monitors now sets the :setting:`event_queue_expires`
  643. setting by default.
  644. The queues will now expire after 60 seconds after the monitor stops
  645. consuming from it.
  646. - **Canvas**: ``chunks``/``map``/``starmap`` are now routed based on the target task.
  647. - **Canvas**: ``Signature.link`` now works when argument is scalar (not a list)
  648. (Issue #2019).
  649. - **App**: The application can now change how task names are generated using
  650. the :meth:`~@gen_task_name` method.
  651. Contributed by Dmitry Malinovsky.
  652. - **App**: App has new ``app.current_worker_task`` property that
  653. returns the task that is currently being worked on (or :const:`None`).
  654. (Issue #2100).
  655. - **Tasks**: ``Task.subtask`` renamed to ``Task.signature`` with alias.
  656. - **Tasks**: ``Task.subtask_from_request`` renamed to
  657. ``Task.signature_from_request`` with alias.
  658. - **Tasks**: The ``delivery_mode`` attribute for :class:`kombu.Queue` is now
  659. respected (Issue #1953).
  660. - **Tasks**: Routes in :setting:`task-routes` can now specify a
  661. :class:`~kombu.Queue` instance directly.
  662. Example:
  663. .. code-block:: python
  664. task_routes = {'proj.tasks.add': {'queue': Queue('add')}}
  665. - **Tasks**: ``AsyncResult`` now raises :exc:`ValueError` if task_id is None.
  666. (Issue #1996).
  667. - **Tasks**: ``result.get()`` now supports an ``on_message`` argument to set a
  668. callback to be called for every message received.
  669. - **Tasks**: New abstract classes added:
  670. - :class:`~celery.utils.abstract.CallableTask`
  671. Looks like a task.
  672. - :class:`~celery.utils.abstract.CallableSignature`
  673. Looks like a task signature.
  674. - **Programs**: :program:`celery multi` now passes through `%i` and `%I` log
  675. file formats.
  676. - **Programs**: ``%p`` can now be used to expand to the full worker node-name
  677. in log-file/pid-file arguments.
  678. - **Programs**: A new command line option
  679. :option:`--executable <celery worker --executable>` is now
  680. available for daemonizing programs (:program:`celery worker` and
  681. :program:`celery beat`).
  682. Contributed by Bert Vanderbauwhede.
  683. - **Programs**: :program:`celery worker` supports new
  684. :option:`--prefetch-multiplier <celery worker --prefetch-multiplier>` option.
  685. Contributed by Mickaël Penhard.
  686. - **Deployment**: Generic init-scripts now support
  687. :envvar:`CELERY_SU`` and :envvar:`CELERYD_SU_ARGS` environment variables
  688. to set the path and arguments for :command:`su` (:manpage:`su(1)`).
  689. - **Prefork**: Prefork pool now uses ``poll`` instead of ``select`` where
  690. available (Issue #2373).
  691. - **Eventlet**: Now returns pool size in :program:`celery inspect stats`
  692. command.
  693. Contributed by Alexander Oblovatniy.
  694. - **Tasks**: New :setting:`email_charset` setting allows for changing
  695. the character set used for outgoing error emails.
  696. Contributed by Vladimir Gorbunov.
  697. - **Worker**: Now respects :setting:`broker_connection_retry` setting.
  698. Fix contributed by Nat Williams.
  699. - **Worker**: Auto-scale did not always update keep-alive when scaling down.
  700. Fix contributed by Philip Garnero.
  701. - **General**: Dates are now always timezone aware even if
  702. :setting:`enable_utc` is disabled (Issue #943).
  703. Fix contributed by Omer Katz.
  704. - **Result Backends**: The redis result backend now has a default socket
  705. timeout of 5 seconds.
  706. The default can be changed using the new :setting:`redis_socket_timeout`
  707. setting.
  708. Contributed by Raghuram Srinivasan.
  709. - **Result Backends**: RPC Backend result queues are now auto delete by
  710. default (Issue #2001).
  711. - **Result Backends**: MongoDB now supports setting the
  712. :setting:`result_serialzier` setting to ``bson`` to use the MongoDB
  713. libraries own serializer.
  714. Contributed by Davide Quarta.
  715. - **Result Backends**: SQLAlchemy result backend now ignores all result
  716. engine options when using NullPool (Issue #1930).
  717. - **Result Backends**: MongoDB URI handling has been improved to use
  718. database name, user and password from the URI if provided.
  719. Contributed by Samuel Jaillet.
  720. - **Result Backends**: Fix problem with RPC/AMQP backends where exception
  721. was not deserialized properly with the json serializer (Issue #2518).
  722. Fix contributed by Allard Hoeve.
  723. - **Result Backends**: Database backend now sets max char size to 155 to deal
  724. with brain damaged MySQL unicode implementation (Issue #1748).
  725. - **General**: All Celery exceptions/warnings now inherit from common
  726. :class:`~celery.exceptions.CeleryException`/:class:`~celery.exceptions.CeleryWarning`.
  727. (Issue #2643).
  728. - **Tasks**: Task retry now also throws in eager mode.
  729. Fix contributed by Feanil Patel.
  730. - **Tasks**: Task error email character set now set to ``utf-8`` by default
  731. (Issue #2737).
  732. - Apps can now define how tasks are named (:meth:`@gen_task_name`).
  733. Contributed by Dmitry Malinovsky
  734. - Module ``celery.worker.job`` renamed to :mod:`celery.worker.request`.
  735. - Beat: ``Scheduler.Publisher``/``.publisher`` renamed to
  736. ``.Producer``/``.producer``.
  737. Incompatible changes
  738. ====================
  739. - Prefork: Calling ``result.get()`` or joining any result from within a task
  740. now raises :exc:`RuntimeError`.
  741. In previous versions this would emit a warning.
  742. - :mod:`celery.worker.consumer` is now a package, not a module.
  743. - Result: The task_name argument/attribute of :class:`@AsyncResult` was
  744. removed.
  745. This was historically a field used for :mod:`pickle` compatibility,
  746. but is no longer needed.
  747. - Backends: Arguments named ``status`` renamed to ``state``.
  748. - Backends: ``backend.get_status()`` renamed to ``backend.get_state()``.
  749. Unscheduled Removals
  750. ====================
  751. - The experimental :mod:`celery.contrib.methods` feature has been removed,
  752. as there were far many bugs in the implementation to be useful.
  753. - The CentOS init-scripts have been removed.
  754. These did not really add any features over the generic init-scripts,
  755. so you are encouraged to use them instead, or something like
  756. :pypi:`supervisor`.
  757. .. _v400-removals:
  758. Scheduled Removals
  759. ==================
  760. Modules
  761. -------
  762. - Module ``celery.worker.job`` has been renamed to :mod:`celery.worker.request`.
  763. This was an internal module so should not have any effect.
  764. It is now part of the public API so should not change again.
  765. - Module ``celery.task.trace`` has been renamed to ``celery.app.trace``
  766. as the ``celery.task`` package is being phased out. The module
  767. will be removed in version 5.0 so please change any import from::
  768. from celery.task.trace import X
  769. to::
  770. from celery.app.trace import X
  771. - Old compatibility aliases in the :mod:`celery.loaders` module
  772. has been removed.
  773. - Removed ``celery.loaders.current_loader()``, use: ``current_app.loader``
  774. - Removed ``celery.loaders.load_settings()``, use: ``current_app.conf``
  775. Result
  776. ------
  777. - ``AsyncResult.serializable()`` and ``celery.result.from_serializable``
  778. has been removed:
  779. Use instead:
  780. .. code-block:: pycon
  781. >>> tup = result.as_tuple()
  782. >>> from celery.result import result_from_tuple
  783. >>> result = result_from_tuple(tup)
  784. - Removed ``BaseAsyncResult``, use ``AsyncResult`` for instance checks
  785. instead.
  786. - Removed ``TaskSetResult``, use ``GroupResult`` instead.
  787. - ``TaskSetResult.total`` -> ``len(GroupResult)``
  788. - ``TaskSetResult.taskset_id`` -> ``GroupResult.id``
  789. - Removed ``ResultSet.subtasks``, use ``ResultSet.results`` instead.
  790. TaskSet
  791. -------
  792. TaskSet has been renamed to group and TaskSet will be removed in version 4.0.
  793. Old::
  794. >>> from celery.task import TaskSet
  795. >>> TaskSet(add.subtask((i, i)) for i in xrange(10)).apply_async()
  796. New::
  797. >>> from celery import group
  798. >>> group(add.s(i, i) for i in xrange(10))()
  799. Events
  800. ------
  801. - Removals for class :class:`celery.events.state.Worker`:
  802. - ``Worker._defaults`` attribute.
  803. Use ``{k: getattr(worker, k) for k in worker._fields}``.
  804. - ``Worker.update_heartbeat``
  805. Use ``Worker.event(None, timestamp, received)``
  806. - ``Worker.on_online``
  807. Use ``Worker.event('online', timestamp, received, fields)``
  808. - ``Worker.on_offline``
  809. Use ``Worker.event('offline', timestamp, received, fields)``
  810. - ``Worker.on_heartbeat``
  811. Use ``Worker.event('heartbeat', timestamp, received, fields)``
  812. - Removals for class :class:`celery.events.state.Task`:
  813. - ``Task._defaults`` attribute.
  814. Use ``{k: getattr(task, k) for k in task._fields}``.
  815. - ``Task.on_sent``
  816. Use ``Worker.event('sent', timestamp, received, fields)``
  817. - ``Task.on_received``
  818. Use ``Task.event('received', timestamp, received, fields)``
  819. - ``Task.on_started``
  820. Use ``Task.event('started', timestamp, received, fields)``
  821. - ``Task.on_failed``
  822. Use ``Task.event('failed', timestamp, received, fields)``
  823. - ``Task.on_retried``
  824. Use ``Task.event('retried', timestamp, received, fields)``
  825. - ``Task.on_succeeded``
  826. Use ``Task.event('succeeded', timestamp, received, fields)``
  827. - ``Task.on_revoked``
  828. Use ``Task.event('revoked', timestamp, received, fields)``
  829. - ``Task.on_unknown_event``
  830. Use ``Task.event(short_type, timestamp, received, fields)``
  831. - ``Task.update``
  832. Use ``Task.event(short_type, timestamp, received, fields)``
  833. - ``Task.merge``
  834. Contact us if you need this.
  835. Magic keyword arguments
  836. -----------------------
  837. Support for the very old magic keyword arguments accepted by tasks is
  838. finally removed in this version.
  839. If you are still using these you have to rewrite any task still
  840. using the old ``celery.decorators`` module and depending
  841. on keyword arguments being passed to the task,
  842. for example::
  843. from celery.decorators import task
  844. @task()
  845. def add(x, y, task_id=None):
  846. print('My task id is %r' % (task_id,))
  847. should be rewritten into::
  848. from celery import task
  849. @task(bind=True)
  850. def add(self, x, y):
  851. print('My task id is {0.request.id}'.format(self))
  852. Settings
  853. --------
  854. The following settings have been removed, and is no longer supported:
  855. Logging Settings
  856. ~~~~~~~~~~~~~~~~
  857. ===================================== =====================================
  858. **Setting name** **Replace with**
  859. ===================================== =====================================
  860. ``CELERYD_LOG_LEVEL`` :option:`celery worker --loglevel`
  861. ``CELERYD_LOG_FILE`` :option:`celery worker --logfile`
  862. ``CELERYBEAT_LOG_LEVEL`` :option:`celery beat --loglevel`
  863. ``CELERYBEAT_LOG_FILE`` :option:`celery beat --loglevel`
  864. ``CELERYMON_LOG_LEVEL`` celerymon is deprecated, use flower.
  865. ``CELERYMON_LOG_FILE`` celerymon is deprecated, use flower.
  866. ``CELERYMON_LOG_FORMAT`` celerymon is deprecated, use flower.
  867. ===================================== =====================================
  868. Task Settings
  869. ~~~~~~~~~~~~~~
  870. ===================================== =====================================
  871. **Setting name** **Replace with**
  872. ===================================== =====================================
  873. ``CELERY_CHORD_PROPAGATES`` N/A
  874. ===================================== =====================================
  875. .. _v400-deprecations:
  876. Deprecation Time-line Changes
  877. =============================
  878. See the :ref:`deprecation-timeline`.
  879. .. _v400-fixes:
  880. Fixes
  881. =====