whatsnew-4.0.rst 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716
  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. XXX To be written
  33. Wall of Contributors
  34. --------------------
  35. XXX Needs update
  36. Aaron McMillin, Adam Renberg, Adrien Guinet, Ahmet Demir, Aitor Gómez-Goiri,
  37. Albert Wang, Alex Koshelev, Alex Rattray, Alex Williams, Alexander Koshelev,
  38. Alexander Lebedev, Alexander Oblovatniy, Alexey Kotlyarov, Ali Bozorgkhan,
  39. Alice Zoë Bevan–McGregor, Allard Hoeve, Alman One, Andrea Rabbaglietti,
  40. Andrea Rosa, Andrei Fokau, Andrew Rodionoff, Andriy Yurchuk,
  41. Aneil Mallavarapu, Areski Belaid, Artyom Koval, Ask Solem, Balthazar Rouberol,
  42. Berker Peksag, Bert Vanderbauwhede, Brian Bouterse, Chris Duryee, Chris Erway,
  43. Chris Harris, Chris Martin, Corey Farwell, Craig Jellick, Cullen Rhodes,
  44. Dallas Marlow, Daniel Wallace, Danilo Bargen, Davanum Srinivas, Dave Smith,
  45. David Baumgold, David Harrigan, David Pravec, Dennis Brakhane, Derek Anderson,
  46. Dmitry Malinovsky, Dudás Ádám, Dustin J. Mitchell, Ed Morley, Fatih Sucu,
  47. Feanil Patel, Felix Schwarz, Fernando Rocha, Flavio Grossi, Frantisek Holop,
  48. Gao Jiangmiao, Gerald Manipon, Gilles Dartiguelongue, Gino Ledesma,
  49. Hank John, Hogni Gylfason, Ilya Georgievsky, Ionel Cristian Mărieș,
  50. James Pulec, Jared Lewis, Jason Veatch, Jasper Bryant-Greene, Jeremy Tillman,
  51. Jocelyn Delalande, Joe Jevnik, John Anderson, John Kirkham, John Whitlock,
  52. Joshua Harlow, Juan Rossi, Justin Patrin, Kai Groner, Kevin Harvey,
  53. Konstantinos Koukopoulos, Kouhei Maeda, Kracekumar Ramaraju,
  54. Krzysztof Bujniewicz, Latitia M. Haskins, Len Buckens, Lorenzo Mancini,
  55. Lucas Wiman, Luke Pomfrey, Marcio Ribeiro, Marin Atanasov Nikolov,
  56. Mark Parncutt, Maxime Vdb, Mher Movsisyan, Michael (:github_user:`michael-k`),
  57. Michael Duane Mooring, Michael Permana, Mickaël Penhard, Mike Attwood,
  58. Morton Fox, Môshe van der Sterre, Nat Williams, Nathan Van Gheem, Nik Nyby,
  59. Omer Katz, Omer Korner, Ori Hoch, Paul Pearce, Paulo Bu, Philip Garnero,
  60. Piotr Maślanka, Radek Czajka, Raghuram Srinivasan, Randy Barlow,
  61. Rodolfo Carvalho, Roger Hu, Rongze Zhu, Ross Deane, Ryan Luckie,
  62. Rémy Greinhofer, Samuel Jaillet, Sergey Azovskov, Sergey Tikhonov,
  63. Seungha Kim, Steve Peak, Sukrit Khera, Tadej Janež, Tewfik Sadaoui,
  64. Thomas French, Thomas Grainger, Tobias Schottdorf, Tocho Tochev,
  65. Valentyn Klindukh, Vic Kumar, Vladimir Bolshakov, Vladimir Gorbunov,
  66. Wayne Chang, Wil Langford, Will Thompson, William King, Yury Selivanov,
  67. Zoran Pavlovic, 許邱翔, :github_user:`allenling`, :github_user:`bee-keeper`,
  68. :github_user:`ffeast`, :github_user:`flyingfoxlee`, :github_user:`gdw2`,
  69. :github_user:`gitaarik`, :github_user:`hankjin`, :github_user:`m-vdb`,
  70. :github_user:`mdk`, :github_user:`nokrik`, :github_user:`ocean1`,
  71. :github_user:`orlo666`, :github_user:`raducc`, :github_user:`wanglei`,
  72. :github_user:`worldexception`.
  73. .. _v400-important:
  74. Important Notes
  75. ===============
  76. Dropped support for Python 2.6
  77. ------------------------------
  78. Celery now requires Python 2.7 or later,
  79. and also drops support for Python 3.3 so supported versions are:
  80. - CPython 2.7
  81. - CPython 3.4
  82. - CPython 3.5
  83. - PyPy 4.0 (``pypy2``)
  84. - PyPy 2.4 (``pypy3``)
  85. Last major version to support Python 2
  86. --------------------------------------
  87. Starting from Celery 5.0 only Python 3.6+ will be supported.
  88. To make sure you're not affected by this change you should pin
  89. the Celery version in your requirements file, either to a specific
  90. version: ``celery==4.0.0``, or a range: ``celery>=4.0,<5.0``.
  91. Dropping support for Python 2 will enable us to remove massive
  92. amounts of compatibility code, and going with Python 3.6 allows
  93. us to take advantage of typing, async/await, asyncio, ++, for which
  94. there're no convenient alternatives in older versions.
  95. Celery 4.x will continue to work on Python 2.7, 3.4, 3.5; just as Celery 3.x
  96. still works on Python 2.6.
  97. Removed features
  98. ----------------
  99. - Microsoft Windows is no longer supported.
  100. - Jython is no longer supported.
  101. Features removed for simplicity
  102. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  103. - Webhook task machinery (``celery.task.http``) has been removed.
  104. Nowadays it's easy to use the :pypi:`requests` module to write
  105. webhook tasks manually. We would love to use requests but we
  106. are simply unable to as there's a very vocal 'anti-dependency'
  107. mob in the Python community
  108. If you need backwards compatibility
  109. you can simply copy + paste the 3.1 version of the module and make sure
  110. it's imported by the worker:
  111. https://github.com/celery/celery/blob/3.1/celery/task/http.py
  112. - Task no longer sends error emails.
  113. This also removes support for ``app.mail_admins``, and any functionality
  114. related to sending emails.
  115. - ``celery.contrib.batches`` has been removed.
  116. This was an experimental feature, so not covered by our deprecation
  117. timeline guarantee.
  118. Features removed for lack of funding
  119. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  120. We announced with the 3.1 release that some transports were
  121. moved to experimental status, and that there'd be no official
  122. support for the transports, citing a lack of resources.
  123. As this subtle hint for the need of funding failed
  124. we've removed them completely, breaking backwards compatibility.
  125. - Using MongoDB as a broker is no longer supported.
  126. - Using the Django ORM as a broker is no longer supported.
  127. - Using SQLAlchemy as a broker is no longer supported.
  128. - Using CouchDB as a broker is no longer supported.
  129. - Using IronMQ as a broker is no longer supported.
  130. - Using Beanstalk as a broker is no longer supported.
  131. In addition some features have been removed completely so that
  132. attempting to use them will raise an exception:
  133. - The ``--autoreload`` feature has been removed.
  134. This was an experimental feature, and not covered by our deprecation
  135. timeline guarantee. The flag is removed completely so the worker
  136. will crash at startup when present. Luckily this
  137. flag isn't used in production systems.
  138. - The ``--autoscale`` feature has been removed.
  139. This flag is only used by companies to save money, but had
  140. bugs either nobody cared to work on, or sponsor a few hours of work to get it fixed.
  141. The flag has been removed completely, so you must remove this command-line
  142. argument or your workers will crash.
  143. - The experimental ``threads`` pool is no longer supported and has been removed.
  144. - The force_execv feature is no longer supported.
  145. The ``celery worker`` command now ignores the ``--no-execv``,
  146. ``--force-execv``, and the ``CELERYD_FORCE_EXECV`` setting.
  147. This flag will be removed completely in 5.0 and the worker
  148. will raise an error.
  149. - The old legacy "amqp" result backend has been deprecated, and will
  150. be removed in Celery 5.0.
  151. Please use the ``rpc`` result backend for RPC-style calls, and a
  152. persistent result backend for multi-consumer results.
  153. **Now to the good news...**
  154. New Task Message Protocol
  155. -------------------------
  156. .. :sha:`e71652d384b1b5df2a4e6145df9f0efb456bc71c`
  157. This version introduces a brand new task message protocol,
  158. the first major change to the protocol since the beginning of the project.
  159. The new protocol is enabled by default in this version and since the new
  160. version isn't backwards compatible you have to be careful when upgrading.
  161. The 3.1.24 version was released to add compatibility with the new protocol
  162. so the easiest way to upgrade is to upgrade to that version first, then
  163. upgrade to 4.0 in a second deployment.
  164. If you wish to keep using the old protocol you may also configure
  165. the protocol version number used:
  166. .. code-block:: python
  167. app = Celery()
  168. app.conf.task_protocol = 1
  169. Read more about the features available in the new protocol in the news
  170. section found later in this document.
  171. Lowercase setting names
  172. -----------------------
  173. In the pursuit of beauty all settings are now renamed to be in all
  174. lowercase and some setting names have been renamed for consistency.
  175. This change is fully backwards compatible so you can still use the uppercase
  176. setting names, but we would like you to upgrade as soon as possible and
  177. you can this automatically using the :program:`celery upgrade settings`
  178. command:
  179. .. code-block:: console
  180. $ celery upgrade settings proj/settings.py
  181. This command will modify your module in-place to use the new lower-case
  182. names (if you want uppercase with a celery prefix see block below),
  183. and save a backup in :file:`proj/settings.py.orig`.
  184. .. admonition:: For Django users and others who want to keep uppercase names
  185. If you're loading Celery configuration from the Django settings module
  186. then you'll want to keep using the uppercase names.
  187. You also want to use a ``CELERY_`` prefix so that no Celery settings
  188. collide with Django settings used by other apps.
  189. To do this, you'll first need to convert your settings file
  190. to use the new consistent naming scheme, and add the prefix to all
  191. Celery related settings:
  192. .. code-block:: console
  193. $ celery upgrade settings --django proj/settings.py
  194. After upgrading the settings file, you need to set the prefix explicitly
  195. in your ``proj/celery.py`` module:
  196. .. code-block:: python
  197. app.config_from_object('django.conf:settings', namespace='CELERY')
  198. You can find the most up to date Django celery integration example
  199. here: :ref:`django-first-steps`.
  200. Note that this will also add a prefix to settings that didn't previously
  201. have one, like ``BROKER_URL``.
  202. Luckily you don't have to manually change the files, as
  203. the :program:`celery upgrade settings --django` program should do the
  204. right thing.
  205. The loader will try to detect if your configuration is using the new format,
  206. and act accordingly, but this also means you're not allowed to mix and
  207. match new and old setting names, that's unless you provide a value for both
  208. alternatives.
  209. The major difference between previous versions, apart from the lower case
  210. names, are the renaming of some prefixes, like ``celerybeat_`` to ``beat_``,
  211. ``celeryd_`` to ``worker_``.
  212. The ``celery_`` prefix has also been removed, and task related settings
  213. from this name-space is now prefixed by ``task_``, worker related settings
  214. with ``worker_``.
  215. Apart from this most of the settings will be the same in lowercase, apart from
  216. a few special ones:
  217. ===================================== ==========================================================
  218. **Setting name** **Replace with**
  219. ===================================== ==========================================================
  220. ``CELERY_MAX_CACHED_RESULTS`` :setting:`result_cache_max`
  221. ``CELERY_MESSAGE_COMPRESSION`` :setting:`result_compression`/:setting:`task_compression`.
  222. ``CELERY_TASK_RESULT_EXPIRES`` :setting:`result_expires`
  223. ``CELERY_RESULT_DBURI`` :setting:`sqlalchemy_dburi`
  224. ``CELERY_RESULT_ENGINE_OPTIONS`` :setting:`sqlalchemy_engine_options`
  225. ``-*-_DB_SHORT_LIVED_SESSIONS`` :setting:`sqlalchemy_short_lived_sessions`
  226. ``CELERY_RESULT_DB_TABLE_NAMES`` :setting:`sqlalchemy_db_names`
  227. ``CELERY_ACKS_LATE`` :setting:`task_acks_late`
  228. ``CELERY_ALWAYS_EAGER`` :setting:`task_always_eager`
  229. ``CELERY_ANNOTATIONS`` :setting:`task_annotations`
  230. ``CELERY_MESSAGE_COMPRESSION`` :setting:`task_compression`
  231. ``CELERY_CREATE_MISSING_QUEUES`` :setting:`task_create_missing_queues`
  232. ``CELERY_DEFAULT_DELIVERY_MODE`` :setting:`task_default_delivery_mode`
  233. ``CELERY_DEFAULT_EXCHANGE`` :setting:`task_default_exchange`
  234. ``CELERY_DEFAULT_EXCHANGE_TYPE`` :setting:`task_default_exchange_type`
  235. ``CELERY_DEFAULT_QUEUE`` :setting:`task_default_queue`
  236. ``CELERY_DEFAULT_RATE_LIMIT`` :setting:`task_default_rate_limit`
  237. ``CELERY_DEFAULT_ROUTING_KEY`` :setting:`task_default_routing_key`
  238. ``-"-_EAGER_PROPAGATES_EXCEPTIONS`` :setting:`task_eager_propagates`
  239. ``CELERY_IGNORE_RESULT`` :setting:`task_ignore_result`
  240. ``CELERY_TASK_PUBLISH_RETRY`` :setting:`task_publish_retry`
  241. ``CELERY_TASK_PUBLISH_RETRY_POLICY`` :setting:`task_publish_retry_policy`
  242. ``CELERY_QUEUES`` :setting:`task_queues`
  243. ``CELERY_ROUTES`` :setting:`task_routes`
  244. ``CELERY_SEND_TASK_SENT_EVENT`` :setting:`task_send_sent_event`
  245. ``CELERY_TASK_SERIALIZER`` :setting:`task_serializer`
  246. ``CELERYD_TASK_SOFT_TIME_LIMIT`` :setting:`task_soft_time_limit`
  247. ``CELERYD_TASK_TIME_LIMIT`` :setting:`task_time_limit`
  248. ``CELERY_TRACK_STARTED`` :setting:`task_track_started`
  249. ``CELERY_DISABLE_RATE_LIMITS`` :setting:`worker_disable_rate_limits`
  250. ``CELERY_ENABLE_REMOTE_CONTROL`` :setting:`worker_enable_remote_control`
  251. ``CELERYD_SEND_EVENTS`` :setting:`worker_send_task_events`
  252. ===================================== ==========================================================
  253. You can see a full table of the changes in :ref:`conf-old-settings-map`.
  254. JSON is now the default serializer
  255. ----------------------------------
  256. The time has finally come to end the reign of :mod:`pickle` as the default
  257. serialization mechanism, and json is the default serializer starting from this
  258. version.
  259. This change was :ref:`announced with the release of Celery 3.1
  260. <last-version-to-enable-pickle>`.
  261. If you're still depending on :mod:`pickle` being the default serializer,
  262. then you have to configure your app before upgrading to 4.0:
  263. .. code-block:: python
  264. task_serializer = 'pickle'
  265. result_serializer = 'pickle'
  266. accept_content = {'pickle'}
  267. The Task base class no longer automatically register tasks
  268. ----------------------------------------------------------
  269. The :class:`~@Task` class is no longer using a special meta-class
  270. that automatically registers the task in the task registry.
  271. Instead this is now handled by the :class:`@task` decorators.
  272. If you're still using class based tasks, then you need to register
  273. these manually:
  274. .. code-block:: python
  275. class CustomTask(Task):
  276. def run(self):
  277. print('running')
  278. app.tasks.register(CustomTask())
  279. The best practice is to use custom task classes only for overriding
  280. general behavior, and then using the task decorator to realize the task:
  281. .. code-block:: python
  282. @app.task(bind=True, base=CustomTask)
  283. def custom(self):
  284. print('running')
  285. This change also means the ``abstract`` attribute of the task
  286. no longer has any effect.
  287. Task argument checking
  288. ----------------------
  289. The arguments of the task are now verified when calling the task,
  290. even asynchronously:
  291. .. code-block:: pycon
  292. >>> @app.task
  293. ... def add(x, y):
  294. ... return x + y
  295. >>> add.delay(8, 8)
  296. <AsyncResult: f59d71ca-1549-43e0-be41-4e8821a83c0c>
  297. >>> add.delay(8)
  298. Traceback (most recent call last):
  299. File "<stdin>", line 1, in <module>
  300. File "celery/app/task.py", line 376, in delay
  301. return self.apply_async(args, kwargs)
  302. File "celery/app/task.py", line 485, in apply_async
  303. check_arguments(*(args or ()), **(kwargs or {}))
  304. TypeError: add() takes exactly 2 arguments (1 given)
  305. Redis Events not backward compatible
  306. ------------------------------------
  307. The Redis ``fanout_patterns`` and ``fanout_prefix`` transport
  308. options are now enabled by default.
  309. Workers/monitors without these flags enabled won't be able to
  310. see workers with this flag disabled. They can still execute tasks,
  311. but they cannot receive each others monitoring messages.
  312. You can upgrade in a backward compatible manner by first configuring
  313. your 3.1 workers and monitors to enable the settings, before the final
  314. upgrade to 4.0:
  315. .. code-block:: python
  316. BROKER_TRANSPORT_OPTIONS = {
  317. 'fanout_patterns': True,
  318. 'fanout_prefix': True,
  319. }
  320. Django: Auto-discover now supports Django app configurations
  321. ------------------------------------------------------------
  322. The :meth:`@autodiscover` function can now be called without arguments,
  323. and the Django handler will automatically find your installed apps:
  324. .. code-block:: python
  325. app.autodiscover()
  326. The Django integration :ref:`example in the documentation
  327. <django-first-steps>` has been updated to use the argument-less call.
  328. This also ensures comaptibility with the new, ehm, ``appconfig`` stuff
  329. introduced in recent Django versions.
  330. Worker direct queues no longer use auto-delete.
  331. -----------------------------------------------
  332. Workers/clients running 4.0 will no longer be able to send
  333. worker direct messages to workers running older versions, and vice versa.
  334. If you're relying on worker direct messages you should upgrade
  335. your 3.x workers and clients to use the new routing settings first,
  336. by replacing :func:`celery.utils.worker_direct` with this implementation:
  337. .. code-block:: python
  338. from kombu import Exchange, Queue
  339. worker_direct_exchange = Exchange('C.dq2')
  340. def worker_direct(hostname):
  341. return Queue(
  342. '{hostname}.dq2'.format(hostname),
  343. exchange=worker_direct_exchange,
  344. routing_key=hostname,
  345. )
  346. This feature closed Issue #2492.
  347. Old command-line programs removed
  348. ---------------------------------
  349. Installing Celery will no longer install the ``celeryd``,
  350. ``celerybeat`` and ``celeryd-multi`` programs.
  351. This was announced with the release of Celery 3.1, but you may still
  352. have scripts pointing to the old names so make sure you update these
  353. to use the new umbrella command:
  354. +-------------------+--------------+-------------------------------------+
  355. | Program | New Status | Replacement |
  356. +===================+==============+=====================================+
  357. | ``celeryd`` | **REMOVED** | :program:`celery worker` |
  358. +-------------------+--------------+-------------------------------------+
  359. | ``celerybeat`` | **REMOVED** | :program:`celery beat` |
  360. +-------------------+--------------+-------------------------------------+
  361. | ``celeryd-multi`` | **REMOVED** | :program:`celery multi` |
  362. +-------------------+--------------+-------------------------------------+
  363. .. _v400-news:
  364. News
  365. ====
  366. New protocol highlights
  367. -----------------------
  368. The new protocol fixes many problems with the old one, and enables
  369. some long-requested features:
  370. - Most of the data are now sent as message headers, instead of being
  371. serialized with the message body.
  372. In version 1 of the protocol the worker always had to deserialize
  373. the message to be able to read task meta-data like the task id,
  374. name, etc. This also meant that the worker was forced to double-decode
  375. the data, first deserializing the message on receipt, serializing
  376. the message again to send to child process, then finally the child process
  377. deserializes the message again.
  378. Keeping the meta-data fields in the message headers means the worker
  379. doesn't actually have to decode the payload before delivering
  380. the task to the child process, and also that it's now possible
  381. for the worker to reroute a task written in a language different
  382. from Python to a different worker.
  383. - A new ``lang`` message header can be used to specify the programming
  384. language the task is written in.
  385. - Worker stores results for internal errors like ``ContentDisallowed``,
  386. and other deserialization errors.
  387. - Worker stores results and sends monitoring events for unregistered
  388. task errors.
  389. - Worker calls callbacks/errbacks even when the result is sent by the
  390. parent process (e.g. :exc:`WorkerLostError` when a child process
  391. terminates, deserialization errors, unregistered tasks).
  392. - A new ``origin`` header contains information about the process sending
  393. the task (worker node-name, or PID and host-name information).
  394. - A new ``shadow`` header allows you to modify the task name used in logs.
  395. This is useful for dispatch like patterns, like a task that calls
  396. any function using pickle (don't do this at home):
  397. .. code-block:: python
  398. from celery import Task
  399. from celery.utils.imports import qualname
  400. class call_as_task(Task):
  401. def shadow_name(self, args, kwargs, options):
  402. return 'call_as_task:{0}'.format(qualname(args[0]))
  403. def run(self, fun, *args, **kwargs):
  404. return fun(*args, **kwargs)
  405. call_as_task = app.tasks.register(call_as_task())
  406. - New ``argsrepr`` and ``kwargsrepr`` fields contain textual representations
  407. of the task arguments (possibly truncated) for use in logs, monitors, etc.
  408. This means the worker doesn't have to deserialize the message payload
  409. to display the task arguments for informational purposes.
  410. - Chains now use a dedicated ``chain`` field enabling support for chains
  411. of thousands and more tasks.
  412. - New ``parent_id`` and ``root_id`` headers adds information about
  413. a tasks relationship with other tasks.
  414. - ``parent_id`` is the task id of the task that called this task
  415. - ``root_id`` is the first task in the work-flow.
  416. These fields can be used to improve monitors like flower to group
  417. related messages together (like chains, groups, chords, complete
  418. work-flows, etc).
  419. - ``app.TaskProducer`` replaced by :meth:`@amqp.create_task_message`` and
  420. :meth:`@amqp.send_task_message``.
  421. Dividing the responsibilities into creating and sending means that
  422. people who want to send messages using a Python AMQP client directly,
  423. doesn't have to implement the protocol.
  424. The :meth:`@amqp.create_task_message` method calls either
  425. :meth:`@amqp.as_task_v2`, or :meth:`@amqp.as_task_v1` depending
  426. on the configured task protocol, and returns a special
  427. :class:`~celery.app.amqp.task_message` tuple containing the
  428. headers, properties and body of the task message.
  429. .. seealso::
  430. The new task protocol is documented in full here:
  431. :ref:`message-protocol-task-v2`.
  432. Prefork: Tasks now log from the child process
  433. ---------------------------------------------
  434. Logging of task success/failure now happens from the child process
  435. actually executing the task, which means that logging utilities
  436. like Sentry can get full information about tasks that fail, including
  437. variables in the traceback.
  438. Prefork: One log-file per child process
  439. ---------------------------------------
  440. Init-scrips and :program:`celery multi` now uses the `%I` log file format
  441. option (e.g. :file:`/var/log/celery/%n%I.log`).
  442. This change was necessary to ensure each child
  443. process has a separate log file after moving task logging
  444. to the child process, as multiple processes writing to the same
  445. log file can cause corruption.
  446. You're encouraged to upgrade your init-scripts and
  447. :program:`celery multi` arguments to use this new option.
  448. Configure broker URL for read/write separately.
  449. -----------------------------------------------
  450. New :setting:`broker_read_url` and :setting:`broker_write_url` settings
  451. have been added so that separate broker URLs can be provided
  452. for connections used for consuming/publishing.
  453. In addition to the configuration options, two new methods have been
  454. added the app API:
  455. - ``app.connection_for_read()``
  456. - ``app.connection_for_write()``
  457. These should now be used in place of ``app.connection()`` to specify
  458. the intent of the required connection.
  459. .. note::
  460. Two connection pools are available: ``app.pool`` (read), and
  461. ``app.producer_pool`` (write). The latter doesn't actually give connections
  462. but full :class:`kombu.Producer` instances.
  463. .. code-block:: python
  464. def publish_some_message(app, producer=None):
  465. with app.producer_or_acquire(producer) as producer:
  466. ...
  467. def consume_messages(app, connection=None):
  468. with app.connection_or_acquire(connection) as connection:
  469. ...
  470. Canvas Refactor
  471. ---------------
  472. The canvas/work-flow implementation have been heavily refactored
  473. to fix some long outstanding issues.
  474. .. :sha:`d79dcd8e82c5e41f39abd07ffed81ca58052bcd2`
  475. .. :sha:`1e9dd26592eb2b93f1cb16deb771cfc65ab79612`
  476. .. :sha:`e442df61b2ff1fe855881c1e2ff9acc970090f54`
  477. .. :sha:`0673da5c09ac22bdd49ba811c470b73a036ee776`
  478. - Error callbacks can now take real exception and traceback instances
  479. (Issue #2538).
  480. .. code-block:: pycon
  481. >>> add.s(2, 2).on_error(log_error.s()).delay()
  482. Where ``log_error`` could be defined as:
  483. .. code-block:: python
  484. @app.task
  485. def log_error(request, exc, traceback):
  486. with open(os.path.join('/var/errors', request.id), 'a') as fh:
  487. print('--\n\n{0} {1} {2}'.format(
  488. task_id, exc, traceback), file=fh)
  489. See :ref:`guide-canvas` for more examples.
  490. - Now unrolls groups within groups into a single group (Issue #1509).
  491. - chunks/map/starmap tasks now routes based on the target task
  492. - chords and chains can now be immutable.
  493. - Fixed bug where serialized signatures weren't converted back into
  494. signatures (Issue #2078)
  495. Fix contributed by **Ross Deane**.
  496. - Fixed problem where chains and groups didn't work when using JSON
  497. serialization (Issue #2076).
  498. Fix contributed by **Ross Deane**.
  499. - Creating a chord no longer results in multiple values for keyword
  500. argument 'task_id' (Issue #2225).
  501. Fix contributed by **Aneil Mallavarapu**.
  502. - Fixed issue where the wrong result is returned when a chain
  503. contains a chord as the penultimate task.
  504. Fix contributed by **Aneil Mallavarapu**.
  505. - Special case of ``group(A.s() | group(B.s() | C.s()))`` now works.
  506. - Chain: Fixed bug with incorrect id set when a subtask is also a chain.
  507. - ``group | group`` is now flattened into a single group (Issue #2573).
  508. - Fixed issue where ``group | task`` wasn't upgrading correctly
  509. to chord (Issue #2922).
  510. Amazon SQS transport now officially supported.
  511. ----------------------------------------------
  512. The SQS broker transport has been rewritten to use async I/O and as such
  513. joins RabbitMQ and Redis as officially supported transports.
  514. The new implementation also takes advantage of long polling,
  515. and closes several issues related to using SQS as a broker.
  516. This work was sponsored by Nextdoor.
  517. Apache QPid transport now officially supported.
  518. -----------------------------------------------
  519. Contributed by **Brian Bouterse**.
  520. Schedule tasks based on sunrise, sunset, dawn and dusk.
  521. -------------------------------------------------------
  522. See :ref:`beat-solar` for more information.
  523. Contributed by **Mark Parncutt**.
  524. New API for configuring periodic tasks
  525. --------------------------------------
  526. This new API enables you to use signatures when defining periodic tasks,
  527. removing the chance of mistyping task names.
  528. An example of the new API is :ref:`here <beat-entries>`.
  529. .. :sha:`bc18d0859c1570f5eb59f5a969d1d32c63af764b`
  530. .. :sha:`132d8d94d38f4050db876f56a841d5a5e487b25b`
  531. RabbitMQ Priority queue support
  532. -------------------------------
  533. See :ref:`routing-options-rabbitmq-priorities` for more information.
  534. Contributed by **Gerald Manipon**.
  535. Prefork: Limit child process resident memory size.
  536. --------------------------------------------------
  537. .. :sha:`5cae0e754128750a893524dcba4ae030c414de33`
  538. You can now limit the maximum amount of memory allocated per prefork
  539. pool child process by setting the worker
  540. :option:`--maxmemperchild <celery worker --maxmemperchild>` option,
  541. or the :setting:`worker_max_memory_per_child` setting.
  542. The limit is for RSS/resident memory size and is specified in kilobytes.
  543. A child process having exceeded the limit will be terminated and replaced
  544. with a new process after the currently executing task returns.
  545. See :ref:`worker-maxmemperchild` for more information.
  546. Contributed by **Dave Smith**.
  547. Redis: Result backend optimizations
  548. -----------------------------------
  549. RPC is now using pub/sub for streaming task results.
  550. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  551. Calling ``result.get()`` when using the Redis result backend
  552. used to be extremely expensive as it was using polling to wait
  553. for the result to become available. A default polling
  554. interval of 0.5 seconds didn't help performance, but was
  555. necessary to avoid a spin loop.
  556. The new implementation is using Redis Pub/Sub mechanisms to
  557. publish and retrieve results immediately, greatly improving
  558. task round-trip times.
  559. Contributed by **Yaroslav Zhavoronkov** and **Ask Solem**.
  560. New optimized chord join implementation.
  561. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  562. This was an experimental feature introduced in Celery 3.1,
  563. that could only be enabled by adding ``?new_join=1`` to the
  564. result backend URL configuration.
  565. We feel that the implementation has been tested thoroughly enough
  566. to be considered stable and enabled by default.
  567. The new implementation greatly reduces the overhead of chords,
  568. and especially with larger chords the performance benefit can be massive.
  569. New Riak result backend Introduced.
  570. -----------------------------------
  571. See :ref:`conf-riak-result-backend` for more information.
  572. Contributed by **Gilles Dartiguelongue**, **Alman One** and **NoKriK**.
  573. New CouchDB result backend introduced.
  574. --------------------------------------
  575. See :ref:`conf-couchdb-result-backend` for more information.
  576. Contributed by **Nathan Van Gheem**.
  577. New Consul result backend introduced.
  578. -------------------------------------
  579. Add support for Consul as a backend using the Key/Value store of Consul.
  580. Consul has a HTTP API where through you can store keys with their values.
  581. The backend extends KeyValueStoreBackend and implements most of the methods.
  582. Mainly to set, get and remove objects.
  583. This allows Celery to store Task results in the K/V store of Consul.
  584. Consul also allows to set a TTL on keys using the Sessions from Consul. This way
  585. the backend supports auto expiry of Task results.
  586. For more information on Consul visit http://consul.io/
  587. The backend uses python-consul for talking to the HTTP API. This package is fully
  588. Python 3 compliant just as this backend is:
  589. .. code-block:: console
  590. $ pip install python-consul
  591. That installs the required package to talk to Consul's HTTP API from Python.
  592. Contributed by **Wido den Hollander**.
  593. Brand new Cassandra result backend.
  594. -----------------------------------
  595. A brand new Cassandra backend utilizing the new :pypi:`cassandra-driver`
  596. library is replacing the old result backend which was using the older
  597. :pypi:`pycassa` library.
  598. See :ref:`conf-cassandra-result-backend` for more information.
  599. .. # XXX What changed?
  600. New Elasticsearch result backend introduced.
  601. --------------------------------------------
  602. See :ref:`conf-elasticsearch-result-backend` for more information.
  603. Contributed by **Ahmet Demir**.
  604. New File-system result backend introduced.
  605. ------------------------------------------
  606. See :ref:`conf-filesystem-result-backend` for more information.
  607. Contributed by **Môshe van der Sterre**.
  608. Event Batching
  609. --------------
  610. Events are now buffered in the worker and sent as a list which reduces
  611. the overhead required to send monitoring events.
  612. For authors of custom event monitors there will be no action
  613. required as long as you're using the Python celery
  614. helpers (:class:`~@events.Receiver`) to implement your monitor.
  615. However, if you're manually receiving event messages you must now account
  616. for batched event messages which differ from normal event messages
  617. in the following way:
  618. - The routing key for a batch of event messages will be set to
  619. ``<event-group>.multi`` where the only batched event group
  620. is currently ``task`` (giving a routing key of ``task.multi``).
  621. - The message body will be a serialized list-of-dictionaries instead
  622. of a dictionary. Each item in the list can be regarded
  623. as a normal event message body.
  624. .. :sha:`03399b4d7c26fb593e61acf34f111b66b340ba4e`
  625. Task.replace
  626. ------------
  627. Task.replace changed, removes Task.replace_in_chord.
  628. The two methods had almost the same functionality, but the old
  629. ``Task.replace`` would force the new task to inherit the
  630. callbacks/errbacks of the existing task.
  631. If you replace a node in a tree, then you wouldn't expect the new node to
  632. inherit the children of the old node, so this seems like unexpected
  633. behavior.
  634. So ``self.replace(sig)`` now works for any task, in addition ``sig`` can now
  635. be a group.
  636. Groups are automatically converted to a chord, where the callback
  637. will "accumulate" the results of the group tasks.
  638. A new built-in task (`celery.accumulate` was added for this purpose)
  639. Closes #817
  640. Optimized Beat implementation
  641. -----------------------------
  642. The :program:`celery beat` implementation has been optimized
  643. for millions of periodic tasks by using a heap to schedule entries.
  644. Contributed by **Ask Solem** and **Alexander Koshelev**.
  645. Task Auto-retry Decorator
  646. -------------------------
  647. Writing custom retry handling for exception events is so common
  648. that we now have built-in support for it.
  649. For this a new ``autoretry_for`` argument is now supported by
  650. the task decorators, where you can specify a tuple of exceptions
  651. to automatically retry for.
  652. See :ref:`task-autoretry` for more information.
  653. Contributed by **Dmitry Malinovsky**.
  654. .. :sha:`75246714dd11e6c463b9dc67f4311690643bff24`
  655. Remote Task Tracebacks
  656. ----------------------
  657. The new :setting:`task_remote_tracebacks` will make task tracebacks more
  658. useful by injecting the stack of the remote worker.
  659. This feature requires the additional :pypi:`tblib` library.
  660. Contributed by **Ionel Cristian Mărieș**.
  661. Async Result API
  662. ----------------
  663. eventlet/gevent drainers, promises, BLA BLA
  664. Closed issue #2529.
  665. RPC Result Backend matured.
  666. ---------------------------
  667. Lots of bugs in the previously experimental RPC result backend have been fixed
  668. and we now consider it production ready.
  669. Contributed by **Ask Solem**, **Morris Tweed**.
  670. New Task Router API
  671. -------------------
  672. The :setting:`task_routes` setting can now hold functions, and map routes
  673. now support glob patterns and regexes.
  674. Instead of using router classes you can now simply define a function:
  675. .. code-block:: python
  676. def route_for_task(name, args, kwargs, options, task=None, **kwargs):
  677. from proj import tasks
  678. if name == tasks.add.name:
  679. return {'queue': 'hipri'}
  680. If you don't need the arguments you can use start arguments, just make
  681. sure you always also accept star arguments so that we've the ability
  682. to add more features in the future:
  683. .. code-block:: python
  684. def route_for_task(name, *args, **kwargs):
  685. from proj import tasks
  686. if name == tasks.add.name:
  687. return {'queue': 'hipri', 'priority': 9}
  688. Both the ``options`` argument and the new ``task`` keyword argument
  689. are new to the function-style routers, and will make it easier to write
  690. routers based on execution options, or properties of the task.
  691. The optional ``task`` keyword argument won't be set if a task is called
  692. by name using :meth:`@send_task`.
  693. For more examples, including using glob/regexes in routers please see
  694. :setting:`task_routes` and :ref:`routing-automatic`.
  695. In Other News
  696. -------------
  697. Requirements
  698. ~~~~~~~~~~~~
  699. - Now depends on :ref:`Kombu 4.0 <kombu:version-4.0>`.
  700. - Now depends on :pypi:`billiard` version 3.5.
  701. - No longer depends on :pypi:`anyjson`. Good-bye old friend :(
  702. Tasks
  703. ~~~~~
  704. - The "anon-exchange" is now used for simple name-name direct routing.
  705. This increases performance as it completely bypasses the routing table,
  706. in addition it also improves reliability for the Redis broker transport.
  707. - An empty ResultSet now evaluates to True.
  708. Fix contributed by **Colin McIntosh**.
  709. - New :setting:`task_reject_on_worker_lost` setting, and
  710. :attr:`~@Task.reject_on_worker_lost` task attribute decides what happens
  711. when the child worker process executing a late ack task is terminated.
  712. Contributed by **Michael Permana**.
  713. - ``Task.subtask`` renamed to ``Task.signature`` with alias.
  714. - ``Task.subtask_from_request`` renamed to
  715. ``Task.signature_from_request`` with alias.
  716. - The ``delivery_mode`` attribute for :class:`kombu.Queue` is now
  717. respected (Issue #1953).
  718. - Routes in :setting:`task-routes` can now specify a
  719. :class:`~kombu.Queue` instance directly.
  720. Example:
  721. .. code-block:: python
  722. task_routes = {'proj.tasks.add': {'queue': Queue('add')}}
  723. - ``AsyncResult`` now raises :exc:`ValueError` if task_id is None.
  724. (Issue #1996).
  725. - Retried tasks didn't forward expires setting (Issue #3297).
  726. - ``result.get()`` now supports an ``on_message`` argument to set a
  727. callback to be called for every message received.
  728. - New abstract classes added:
  729. - :class:`~celery.utils.abstract.CallableTask`
  730. Looks like a task.
  731. - :class:`~celery.utils.abstract.CallableSignature`
  732. Looks like a task signature.
  733. - ``Task.replace`` now properly forwards callbacks (Issue #2722).
  734. Fix contributed by **Nicolas Unravel**.
  735. - ``Task.replace``: Append to chain/chord (Closes #3232)
  736. Fixed issue #3232, adding the signature to the chain (if there's any).
  737. Fixed the chord suppress if the given signature contains one.
  738. Fix contributed by :github_user:`honux`.
  739. - Task retry now also throws in eager mode.
  740. Fix contributed by **Feanil Patel**.
  741. Beat
  742. ~~~~
  743. - Fixed crontab infinite loop with invalid date.
  744. When occurrence can never be reached (example, April, 31th), trying
  745. to reach the next occurrence would trigger an infinite loop.
  746. Try fixing that by raising a RuntimeError after 2,000 iterations
  747. (Also added a test for crontab leap years in the process)
  748. Fix contributed by **Romuald Brunet**.
  749. - Now ensures the program exits with a non-zero exit code when an
  750. exception terminates the service.
  751. Fix contributed by **Simon Peeters**.
  752. App
  753. ~~~
  754. - Dates are now always timezone aware even if
  755. :setting:`enable_utc` is disabled (Issue #943).
  756. Fix contributed by **Omer Katz**.
  757. - **Config**: App preconfiguration is now also pickled with the configuration.
  758. Fix contributed by **Jeremy Zafran**.
  759. - The application can now change how task names are generated using
  760. the :meth:`~@gen_task_name` method.
  761. Contributed by **Dmitry Malinovsky**.
  762. - App has new ``app.current_worker_task`` property that
  763. returns the task that's currently being worked on (or :const:`None`).
  764. (Issue #2100).
  765. Execution Pools
  766. ~~~~~~~~~~~~~~~
  767. - **Eventlet/Gevent**: Fixed race condition leading to "simultaneous read"
  768. errors (Issue #2812).
  769. - **Prefork**: Prefork pool now uses ``poll`` instead of ``select`` where
  770. available (Issue #2373).
  771. - **Prefork**: Fixed bug where the pool would refuse to shut down the
  772. worker (Issue #2606).
  773. - **Eventlet**: Now returns pool size in :program:`celery inspect stats`
  774. command.
  775. Contributed by **Alexander Oblovatniy**.
  776. Transports
  777. ~~~~~~~~~~
  778. - **Redis Transport**: The Redis transport now supports the
  779. :setting:`broker_use_ssl` option.
  780. Programs
  781. ~~~~~~~~
  782. - :program:`celery multi`: ``%n`` format for is now synonym with
  783. ``%N`` to be consistent with :program:`celery worker`.
  784. - :program:`celery inspect`/:program:`celery control`: now supports a new
  785. :option:`--json <celery inspect --json>` option to give output in json format.
  786. - :program:`celery inspect registered`: now ignores built-in tasks.
  787. - :program:`celery purge` now takes ``-Q`` and ``-X`` options
  788. used to specify which queues to include and exclude from the purge.
  789. - New :program:`celery logtool`: Utility for filtering and parsing
  790. celery worker log-files
  791. - :program:`celery multi`: now passes through `%i` and `%I` log
  792. file formats.
  793. - General: ``%p`` can now be used to expand to the full worker node-name
  794. in log-file/pid-file arguments.
  795. - A new command line option
  796. :option:`--executable <celery worker --executable>` is now
  797. available for daemonizing programs (:program:`celery worker` and
  798. :program:`celery beat`).
  799. Contributed by **Bert Vanderbauwhede**.
  800. - :program:`celery worker`: supports new
  801. :option:`--prefetch-multiplier <celery worker --prefetch-multiplier>` option.
  802. Contributed by **Mickaël Penhard**.
  803. Worker
  804. ~~~~~~
  805. - Improvements and fixes for :class:`~celery.utils.collections.LimitedSet`.
  806. Getting rid of leaking memory + adding ``minlen`` size of the set:
  807. the minimal residual size of the set after operating for some time.
  808. ``minlen`` items are kept, even if they should've been expired.
  809. Problems with older and even more old code:
  810. #. Heap would tend to grow in some scenarios
  811. (like adding an item multiple times).
  812. #. Adding many items fast wouldn't clean them soon enough (if ever).
  813. #. When talking to other workers, revoked._data was sent, but
  814. it was processed on the other side as iterable.
  815. That means giving those keys new (current)
  816. time-stamp. By doing this workers could recycle
  817. items forever. Combined with 1) and 2), this means that in
  818. large set of workers, you're getting out of memory soon.
  819. All those problems should be fixed now.
  820. This should fix issues #3095, #3086.
  821. Contributed by **David Pravec**.
  822. - Worker now only starts the remote control command consumer if the
  823. broker transport used actually supports them.
  824. - Gossip now sets ``x-message-ttl`` for event queue to heartbeat_interval s.
  825. (Issue #2005).
  826. - Now preserves exit code (Issue #2024).
  827. - Fixed crash when the ``-purge`` argument was used.
  828. - Log--level for unrecoverable errors changed from ``error`` to
  829. ``critical``.
  830. - Improved rate limiting accuracy.
  831. - Account for missing timezone information in task expires field.
  832. Fix contributed by **Albert Wang**.
  833. - The worker no longer has a ``Queues`` bootsteps, as it is now
  834. superfluous.
  835. - Now emits the "Received task" line even for revoked tasks.
  836. (Issue #3155).
  837. - Now respects :setting:`broker_connection_retry` setting.
  838. Fix contributed by **Nat Williams**.
  839. - New :data:`celery.worker.state.requests` enables O(1) loookup
  840. of active/reserved tasks by id.
  841. - Auto-scale didn't always update keep-alive when scaling down.
  842. Fix contributed by **Philip Garnero**.
  843. - Fixed typo ``options_list`` -> ``option_list``.
  844. Fix contributed by **Greg Wilbur**.
  845. Debugging Utilities
  846. ~~~~~~~~~~~~~~~~~~~
  847. - :mod:`celery.contrib.rdb`: Changed remote debugger banner so that you can copy and paste
  848. the address easily (no longer has a period in the address).
  849. Contributed by **Jonathan Vanasco**.
  850. - Fixed compatibility with recent :pypi:`psutil` versions (Issue #3262).
  851. Signals
  852. ~~~~~~~
  853. - **App**: New signals for app configuration/finalization:
  854. - :data:`app.on_configure <@on_configure>`
  855. - :data:`app.on_after_configure <@on_after_configure>`
  856. - :data:`app.on_after_finalize <@on_after_finalize>`
  857. - **Task**: New task signals for rejected task messages:
  858. - :data:`celery.signals.task_rejected`.
  859. - :data:`celery.signals.task_unknown`.
  860. - **Worker**: New signal for when a heartbeat event is sent.
  861. - :data:`celery.signals.heartbeat_sent`
  862. Contributed by **Kevin Richardson**.
  863. Events
  864. ~~~~~~
  865. - Event messages now uses the RabbitMQ ``x-message-ttl`` option
  866. to ensure older event messages are discarded.
  867. The default is 5 seconds, but can be changed using the
  868. :setting:`event_queue_ttl` setting.
  869. - Event monitors now sets the :setting:`event_queue_expires`
  870. setting by default.
  871. The queues will now expire after 60 seconds after the monitor stops
  872. consuming from it.
  873. - Fixed a bug where a None value wasn't handled properly.
  874. Fix contributed by **Dongweiming**.
  875. - New :setting:`event_queue_prefix` setting can now be used
  876. to change the default ``celeryev`` queue prefix for event receiver queues.
  877. Contributed by **Takeshi Kanemoto**.
  878. - ``State.tasks_by_type`` and ``State.tasks_by_worker`` can now be
  879. used as a mapping for fast access to this information.
  880. Canvas
  881. ~~~~~~
  882. - ``chunks``/``map``/``starmap`` are now routed based on the target task.
  883. - ``Signature.link`` now works when argument is scalar (not a list)
  884. (Issue #2019).
  885. Deployment
  886. ~~~~~~~~~~
  887. - Generic init-scripts now support
  888. :envvar:`CELERY_SU`` and :envvar:`CELERYD_SU_ARGS` environment variables
  889. to set the path and arguments for :command:`su` (:manpage:`su(1)`).
  890. - Generic init-scripts now better support FreBSD and other BSD
  891. systems by searching :file:`/usr/local/etc/` for the configuration file.
  892. Contributed by **Taha Jahangir**.
  893. - Generic init-script: Fixed strange bug for ``celerybeat`` where
  894. restart didn't always work (Issue #3018).
  895. - The systemd init script now uses a shell when executing
  896. services.
  897. Contributed by **Tomas Machalek**.
  898. Result Backends
  899. ~~~~~~~~~~~~~~~
  900. - Redis: Now has a default socket timeout of 5 seconds.
  901. The default can be changed using the new :setting:`redis_socket_timeout`
  902. setting.
  903. Contributed by **Raghuram Srinivasan**.
  904. - RPC Backend result queues are now auto delete by default (Issue #2001).
  905. - RPC Backend: Fixed problem where exception
  906. wasn't deserialized properly with the json serializer (Issue #2518).
  907. Fix contributed by **Allard Hoeve**.
  908. - CouchDB: Fixed typo causing the backend to not be found
  909. (Issue #3287).
  910. Fix contributed by **Andrew Stewart**.
  911. - MongoDB: Now supports setting the :setting:`result_serialzier` setting
  912. to ``bson`` to use the MongoDB libraries own serializer.
  913. Contributed by **Davide Quarta**.
  914. - MongoDB: URI handling has been improved to use
  915. database name, user and password from the URI if provided.
  916. Contributed by **Samuel Jaillet**.
  917. - SQLAlchemy result backend: Now ignores all result
  918. engine options when using NullPool (Issue #1930).
  919. - SQLAlchemy result backend: Now sets max char size to 155 to deal
  920. with brain damaged MySQL unicode implementation (Issue #1748).
  921. - **General**: All Celery exceptions/warnings now inherit from common
  922. :class:`~celery.exceptions.CeleryException`/:class:`~celery.exceptions.CeleryWarning`.
  923. (Issue #2643).
  924. Documentation Improvements
  925. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  926. Contributed by:
  927. - Adam Chainz
  928. - Arthur Vuillard
  929. - Batiste Bieler
  930. - Daniel Devine
  931. - Edward Betts
  932. - Jason Veatch
  933. - Jeff Widman
  934. - Manuel Kaufmann
  935. - Maxime Beauchemin
  936. - Mitchel Humpherys
  937. - Rik
  938. - Tayfun Sen
  939. Reorganization, Deprecations, and Removals
  940. ==========================================
  941. Incompatible changes
  942. --------------------
  943. - Prefork: Calling ``result.get()`` or joining any result from within a task
  944. now raises :exc:`RuntimeError`.
  945. In previous versions this would emit a warning.
  946. - :mod:`celery.worker.consumer` is now a package, not a module.
  947. - Module ``celery.worker.job`` renamed to :mod:`celery.worker.request`.
  948. - Beat: ``Scheduler.Publisher``/``.publisher`` renamed to
  949. ``.Producer``/``.producer``.
  950. - Result: The task_name argument/attribute of :class:`@AsyncResult` was
  951. removed.
  952. This was historically a field used for :mod:`pickle` compatibility,
  953. but is no longer needed.
  954. - Backends: Arguments named ``status`` renamed to ``state``.
  955. - Backends: ``backend.get_status()`` renamed to ``backend.get_state()``.
  956. .. _v400-unscheduled-removals:
  957. Unscheduled Removals
  958. --------------------
  959. - The experimental :mod:`celery.contrib.methods` feature has been removed,
  960. as there were far many bugs in the implementation to be useful.
  961. - The CentOS init-scripts have been removed.
  962. These didn't really add any features over the generic init-scripts,
  963. so you're encouraged to use them instead, or something like
  964. :pypi:`supervisor`.
  965. .. _v400-deprecations-reorg:
  966. Reorganization Deprecations
  967. ---------------------------
  968. These symbols have been renamed, and while there's an alias available in this
  969. version for backward compatibility, they will be removed in Celery 5.0, so
  970. make sure you rename these ASAP to make sure it won't break for that release.
  971. Chances are that you'll only use the first in this list, but you never
  972. know:
  973. - ``celery.utils.worker_direct`` ->
  974. :meth:`celery.utils.nodenames.worker_direct`.
  975. - ``celery.utils.nodename`` -> :meth:`celery.utils.nodenames.nodename`.
  976. - ``celery.utils.anon_nodename`` ->
  977. :meth:`celery.utils.nodenames.anon_nodename`.
  978. - ``celery.utils.nodesplit`` -> :meth:`celery.utils.nodenames.nodesplit`.
  979. - ``celery.utils.default_nodename`` ->
  980. :meth:`celery.utils.nodenames.default_nodename`.
  981. - ``celery.utils.node_format`` -> :meth:`celery.utils.nodenames.node_format`.
  982. - ``celery.utils.host_format`` -> :meth:`celery.utils.nodenames.host_format`.
  983. .. _v400-removals:
  984. Scheduled Removals
  985. ------------------
  986. Modules
  987. ~~~~~~~
  988. - Module ``celery.worker.job`` has been renamed to :mod:`celery.worker.request`.
  989. This was an internal module so shouldn't have any effect.
  990. It's now part of the public API so must not change again.
  991. - Module ``celery.task.trace`` has been renamed to ``celery.app.trace``
  992. as the ``celery.task`` package is being phased out. The module
  993. will be removed in version 5.0 so please change any import from::
  994. from celery.task.trace import X
  995. to::
  996. from celery.app.trace import X
  997. - Old compatibility aliases in the :mod:`celery.loaders` module
  998. has been removed.
  999. - Removed ``celery.loaders.current_loader()``, use: ``current_app.loader``
  1000. - Removed ``celery.loaders.load_settings()``, use: ``current_app.conf``
  1001. Result
  1002. ~~~~~~
  1003. - ``AsyncResult.serializable()`` and ``celery.result.from_serializable``
  1004. has been removed:
  1005. Use instead:
  1006. .. code-block:: pycon
  1007. >>> tup = result.as_tuple()
  1008. >>> from celery.result import result_from_tuple
  1009. >>> result = result_from_tuple(tup)
  1010. - Removed ``BaseAsyncResult``, use ``AsyncResult`` for instance checks
  1011. instead.
  1012. - Removed ``TaskSetResult``, use ``GroupResult`` instead.
  1013. - ``TaskSetResult.total`` -> ``len(GroupResult)``
  1014. - ``TaskSetResult.taskset_id`` -> ``GroupResult.id``
  1015. - Removed ``ResultSet.subtasks``, use ``ResultSet.results`` instead.
  1016. TaskSet
  1017. ~~~~~~~
  1018. TaskSet has been renamed to group and TaskSet will be removed in version 4.0.
  1019. Old::
  1020. >>> from celery.task import TaskSet
  1021. >>> TaskSet(add.subtask((i, i)) for i in xrange(10)).apply_async()
  1022. New::
  1023. >>> from celery import group
  1024. >>> group(add.s(i, i) for i in xrange(10))()
  1025. Events
  1026. ~~~~~~
  1027. - Removals for class :class:`celery.events.state.Worker`:
  1028. - ``Worker._defaults`` attribute.
  1029. Use ``{k: getattr(worker, k) for k in worker._fields}``.
  1030. - ``Worker.update_heartbeat``
  1031. Use ``Worker.event(None, timestamp, received)``
  1032. - ``Worker.on_online``
  1033. Use ``Worker.event('online', timestamp, received, fields)``
  1034. - ``Worker.on_offline``
  1035. Use ``Worker.event('offline', timestamp, received, fields)``
  1036. - ``Worker.on_heartbeat``
  1037. Use ``Worker.event('heartbeat', timestamp, received, fields)``
  1038. - Removals for class :class:`celery.events.state.Task`:
  1039. - ``Task._defaults`` attribute.
  1040. Use ``{k: getattr(task, k) for k in task._fields}``.
  1041. - ``Task.on_sent``
  1042. Use ``Worker.event('sent', timestamp, received, fields)``
  1043. - ``Task.on_received``
  1044. Use ``Task.event('received', timestamp, received, fields)``
  1045. - ``Task.on_started``
  1046. Use ``Task.event('started', timestamp, received, fields)``
  1047. - ``Task.on_failed``
  1048. Use ``Task.event('failed', timestamp, received, fields)``
  1049. - ``Task.on_retried``
  1050. Use ``Task.event('retried', timestamp, received, fields)``
  1051. - ``Task.on_succeeded``
  1052. Use ``Task.event('succeeded', timestamp, received, fields)``
  1053. - ``Task.on_revoked``
  1054. Use ``Task.event('revoked', timestamp, received, fields)``
  1055. - ``Task.on_unknown_event``
  1056. Use ``Task.event(short_type, timestamp, received, fields)``
  1057. - ``Task.update``
  1058. Use ``Task.event(short_type, timestamp, received, fields)``
  1059. - ``Task.merge``
  1060. Contact us if you need this.
  1061. Magic keyword arguments
  1062. ~~~~~~~~~~~~~~~~~~~~~~~
  1063. Support for the very old magic keyword arguments accepted by tasks is
  1064. finally removed in this version.
  1065. If you're still using these you have to rewrite any task still
  1066. using the old ``celery.decorators`` module and depending
  1067. on keyword arguments being passed to the task,
  1068. for example::
  1069. from celery.decorators import task
  1070. @task()
  1071. def add(x, y, task_id=None):
  1072. print('My task id is %r' % (task_id,))
  1073. should be rewritten into::
  1074. from celery import task
  1075. @task(bind=True)
  1076. def add(self, x, y):
  1077. print('My task id is {0.request.id}'.format(self))
  1078. Removed Settings
  1079. ----------------
  1080. The following settings have been removed, and is no longer supported:
  1081. Logging Settings
  1082. ~~~~~~~~~~~~~~~~
  1083. ===================================== =====================================
  1084. **Setting name** **Replace with**
  1085. ===================================== =====================================
  1086. ``CELERYD_LOG_LEVEL`` :option:`celery worker --loglevel`
  1087. ``CELERYD_LOG_FILE`` :option:`celery worker --logfile`
  1088. ``CELERYBEAT_LOG_LEVEL`` :option:`celery beat --loglevel`
  1089. ``CELERYBEAT_LOG_FILE`` :option:`celery beat --loglevel`
  1090. ``CELERYMON_LOG_LEVEL`` celerymon is deprecated, use flower.
  1091. ``CELERYMON_LOG_FILE`` celerymon is deprecated, use flower.
  1092. ``CELERYMON_LOG_FORMAT`` celerymon is deprecated, use flower.
  1093. ===================================== =====================================
  1094. Task Settings
  1095. ~~~~~~~~~~~~~~
  1096. ===================================== =====================================
  1097. **Setting name** **Replace with**
  1098. ===================================== =====================================
  1099. ``CELERY_CHORD_PROPAGATES`` N/A
  1100. ===================================== =====================================
  1101. Changes to internal API
  1102. -----------------------
  1103. - Module ``celery.datastructures`` renamed to :mod:`celery.utils.collections`.
  1104. - ``celery.utils.datastructures.DependencyGraph`` moved to
  1105. :mod:`celery.utils.graph`.
  1106. - ``celery.utils.jsonify`` is now :func:`celery.utils.serialization.jsonify`.
  1107. - ``celery.utils.strtobool`` is now
  1108. :func:`celery.utils.serialization.strtobool`.
  1109. - ``celery.utils.is_iterable`` has been removed.
  1110. Instead use::
  1111. isinstance(x, collections.Iterable)
  1112. - ``celery.utils.lpmerge`` is now :func:`celery.utils.collections.lpmerge`.
  1113. - ``celery.utils.cry`` is now :func:`celery.utils.debug.cry`.
  1114. - ``celery.utils.isatty`` is now :func:`celery.platforms.isatty`.
  1115. - ``celery.utils.gen_task_name`` is now
  1116. :func:`celery.utils.imports.gen_task_name`.
  1117. - ``celery.utils.deprecated`` is now :func:`celery.utils.deprecated.Callable`
  1118. - ``celery.utils.deprecated_property`` is now
  1119. :func:`celery.utils.deprecated.Property`.
  1120. - ``celery.utils.warn_deprecated`` is now :func:`celery.utils.deprecated.warn`
  1121. .. _v400-deprecations:
  1122. Deprecation Time-line Changes
  1123. =============================
  1124. See the :ref:`deprecation-timeline`.