whatsnew-3.1.rst 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278
  1. .. _whatsnew-3.1:
  2. ===========================================
  3. What's new in Celery 3.1 (Cipater)
  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.6, 2.7, and 3.3,
  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. Deadlocks have long plagued our workers, and while uncommon they're
  33. not acceptable. They're also infamous for being extremely hard to diagnose
  34. and reproduce, so to make this job easier I wrote a stress test suite that
  35. bombards the worker with different tasks in an attempt to break it.
  36. What happens if thousands of worker child processes are killed every
  37. second? what if we also kill the broker connection every 10
  38. seconds? These are examples of what the stress test suite will do to the
  39. worker, and it reruns these tests using different configuration combinations
  40. to find edge case bugs.
  41. The end result was that I had to rewrite the prefork pool to avoid the use
  42. of the POSIX semaphore. This was extremely challenging, but after
  43. months of hard work the worker now finally passes the stress test suite.
  44. There's probably more bugs to find, but the good news is
  45. that we now have a tool to reproduce them, so should you be so unlucky to
  46. experience a bug then we'll write a test for it and squash it!
  47. Note that I've also moved many broker transports into experimental status:
  48. the only transports recommended for production use today is RabbitMQ and
  49. Redis.
  50. I don't have the resources to maintain all of them, so bugs are left
  51. unresolved. I wish that someone will step up and take responsibility for
  52. these transports or donate resources to improve them, but as the situation
  53. is now I don't think the quality is up to date with the rest of the code-base
  54. so I cannot recommend them for production use.
  55. The next version of Celery 4.0 will focus on performance and removing
  56. rarely used parts of the library. Work has also started on a new message
  57. protocol, supporting multiple languages and more. The initial draft can
  58. be found :ref:`here <message-protocol-task-v2>`.
  59. This has probably been the hardest release I've worked on, so no
  60. introduction to this changelog would be complete without a massive
  61. thank you to everyone who contributed and helped me test it!
  62. Thank you for your support!
  63. *— Ask Solem*
  64. .. _v310-important:
  65. Important Notes
  66. ===============
  67. Dropped support for Python 2.5
  68. ------------------------------
  69. Celery now requires Python 2.6 or later.
  70. The new dual code base runs on both Python 2 and 3, without
  71. requiring the ``2to3`` porting tool.
  72. .. note::
  73. This is also the last version to support Python 2.6! From Celery 4.0 and
  74. on-wards Python 2.7 or later will be required.
  75. .. _last-version-to-enable-pickle:
  76. Last version to enable Pickle by default
  77. ----------------------------------------
  78. Starting from Celery 4.0 the default serializer will be json.
  79. If you depend on pickle being accepted you should be prepared
  80. for this change by explicitly allowing your worker
  81. to consume pickled messages using the :setting:`CELERY_ACCEPT_CONTENT`
  82. setting:
  83. .. code-block:: python
  84. CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
  85. Make sure you only select the serialization formats you'll actually be using,
  86. and make sure you've properly secured your broker from unwanted access
  87. (see the :ref:`Security Guide <guide-security>`).
  88. The worker will emit a deprecation warning if you don't define this setting.
  89. .. topic:: for Kombu users
  90. Kombu 3.0 no longer accepts pickled messages by default, so if you
  91. use Kombu directly then you have to configure your consumers:
  92. see the :ref:`Kombu 3.0 Changelog <kombu:version-3.0.0>` for more
  93. information.
  94. Old command-line programs removed and deprecated
  95. ------------------------------------------------
  96. Everyone should move to the new :program:`celery` umbrella
  97. command, so we're incrementally deprecating the old command names.
  98. In this version we've removed all commands that aren't used
  99. in init-scripts. The rest will be removed in 4.0.
  100. +-------------------+--------------+-------------------------------------+
  101. | Program | New Status | Replacement |
  102. +===================+==============+=====================================+
  103. | ``celeryd`` | *DEPRECATED* | :program:`celery worker` |
  104. +-------------------+--------------+-------------------------------------+
  105. | ``celerybeat`` | *DEPRECATED* | :program:`celery beat` |
  106. +-------------------+--------------+-------------------------------------+
  107. | ``celeryd-multi`` | *DEPRECATED* | :program:`celery multi` |
  108. +-------------------+--------------+-------------------------------------+
  109. | ``celeryctl`` | **REMOVED** | :program:`celery inspect|control` |
  110. +-------------------+--------------+-------------------------------------+
  111. | ``celeryev`` | **REMOVED** | :program:`celery events` |
  112. +-------------------+--------------+-------------------------------------+
  113. | ``camqadm`` | **REMOVED** | :program:`celery amqp` |
  114. +-------------------+--------------+-------------------------------------+
  115. If this isn't a new installation then you may want to remove the old
  116. commands:
  117. .. code-block:: console
  118. $ pip uninstall celery
  119. $ # repeat until it fails
  120. # ...
  121. $ pip uninstall celery
  122. $ pip install celery
  123. Please run :program:`celery --help` for help using the umbrella command.
  124. .. _v310-news:
  125. News
  126. ====
  127. Prefork Pool Improvements
  128. -------------------------
  129. These improvements are only active if you use an async capable
  130. transport. This means only RabbitMQ (AMQP) and Redis are supported
  131. at this point and other transports will still use the thread-based fallback
  132. implementation.
  133. - Pool is now using one IPC queue per child process.
  134. Previously the pool shared one queue between all child processes,
  135. using a POSIX semaphore as a mutex to achieve exclusive read and write
  136. access.
  137. The POSIX semaphore has now been removed and each child process
  138. gets a dedicated queue. This means that the worker will require more
  139. file descriptors (two descriptors per process), but it also means
  140. that performance is improved and we can send work to individual child
  141. processes.
  142. POSIX semaphores aren't released when a process is killed, so killing
  143. processes could lead to a deadlock if it happened while the semaphore was
  144. acquired. There's no good solution to fix this, so the best option
  145. was to remove the semaphore.
  146. - Asynchronous write operations
  147. The pool now uses async I/O to send work to the child processes.
  148. - Lost process detection is now immediate.
  149. If a child process is killed or exits mysteriously the pool previously
  150. had to wait for 30 seconds before marking the task with a
  151. :exc:`~celery.exceptions.WorkerLostError`. It had to do this because
  152. the out-queue was shared between all processes, and the pool couldn't
  153. be certain whether the process completed the task or not. So an arbitrary
  154. timeout of 30 seconds was chosen, as it was believed that the out-queue
  155. would've been drained by this point.
  156. This timeout is no longer necessary, and so the task can be marked as
  157. failed as soon as the pool gets the notification that the process exited.
  158. - Rare race conditions fixed
  159. Most of these bugs were never reported to us, but were discovered while
  160. running the new stress test suite.
  161. Caveats
  162. ~~~~~~~
  163. .. topic:: Long running tasks
  164. The new pool will send tasks to a child process as long as the process
  165. in-queue is writable, and since the socket is buffered this means
  166. that the processes are, in effect, prefetching tasks.
  167. This benefits performance but it also means that other tasks may be stuck
  168. waiting for a long running task to complete::
  169. -> send T1 to Process A
  170. # A executes T1
  171. -> send T2 to Process B
  172. # B executes T2
  173. <- T2 complete
  174. -> send T3 to Process A
  175. # A still executing T1, T3 stuck in local buffer and
  176. # won't start until T1 returns
  177. The buffer size varies based on the operating system: some may
  178. have a buffer as small as 64KB but on recent Linux versions the buffer
  179. size is 1MB (can only be changed system wide).
  180. You can disable this prefetching behavior by enabling the
  181. :option:`-Ofair <celery worker -O>` worker option:
  182. .. code-block:: console
  183. $ celery -A proj worker -l info -Ofair
  184. With this option enabled the worker will only write to workers that are
  185. available for work, disabling the prefetch behavior.
  186. .. topic:: Max tasks per child
  187. If a process exits and pool prefetch is enabled the worker may have
  188. already written many tasks to the process in-queue, and these tasks
  189. must then be moved back and rewritten to a new process.
  190. This is very expensive if you have the
  191. :option:`--max-tasks-per-child <celery worker --max-tasks-per-child>`
  192. option set to a low value (e.g., less than 10), you should not be
  193. using the :option:`-Ofast <celery worker -O>` scheduler option.
  194. Django supported out of the box
  195. -------------------------------
  196. Celery 3.0 introduced a shiny new API, but unfortunately didn't
  197. have a solution for Django users.
  198. The situation changes with this version as Django is now supported
  199. in core and new Django users coming to Celery are now expected
  200. to use the new API directly.
  201. The Django community has a convention where there's a separate
  202. ``django-x`` package for every library, acting like a bridge between
  203. Django and the library.
  204. Having a separate project for Django users has been a pain for Celery,
  205. with multiple issue trackers and multiple documentation
  206. sources, and then lastly since 3.0 we even had different APIs.
  207. With this version we challenge that convention and Django users will
  208. use the same library, the same API and the same documentation as
  209. everyone else.
  210. There's no rush to port your existing code to use the new API,
  211. but if you'd like to experiment with it you should know that:
  212. - You need to use a Celery application instance.
  213. The new Celery API introduced in 3.0 requires users to instantiate the
  214. library by creating an application:
  215. .. code-block:: python
  216. from celery import Celery
  217. app = Celery()
  218. - You need to explicitly integrate Celery with Django
  219. Celery won't automatically use the Django settings, so you can
  220. either configure Celery separately or you can tell it to use the Django
  221. settings with:
  222. .. code-block:: python
  223. app.config_from_object('django.conf:settings')
  224. Neither will it automatically traverse your installed apps to find task
  225. modules. If you want this behavior, you must explicitly pass a list of
  226. Django instances to the Celery app:
  227. .. code-block:: python
  228. from django.conf import settings
  229. app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  230. - You no longer use ``manage.py``
  231. Instead you use the :program:`celery` command directly:
  232. .. code-block:: console
  233. $ celery -A proj worker -l info
  234. For this to work your app module must store the :envvar:`DJANGO_SETTINGS_MODULE`
  235. environment variable, see the example in the :ref:`Django
  236. guide <django-first-steps>`.
  237. To get started with the new API you should first read the :ref:`first-steps`
  238. tutorial, and then you should read the Django-specific instructions in
  239. :ref:`django-first-steps`.
  240. The fixes and improvements applied by the :pypi:`django-celery` library
  241. are now automatically applied by core Celery when it detects that
  242. the :envvar:`DJANGO_SETTINGS_MODULE` environment variable is set.
  243. The distribution ships with a new example project using Django
  244. in :file:`examples/django`:
  245. https://github.com/celery/celery/tree/3.1/examples/django
  246. Some features still require the :pypi:`django-celery` library:
  247. - Celery doesn't implement the Django database or cache result backends.
  248. - Celery doesn't ship with the database-based periodic task
  249. scheduler.
  250. .. note::
  251. If you're still using the old API when you upgrade to Celery 3.1
  252. then you must make sure that your settings module contains
  253. the ``djcelery.setup_loader()`` line, since this will
  254. no longer happen as a side-effect of importing the :pypi:`django-celery`
  255. module.
  256. New users (or if you've ported to the new API) don't need the ``setup_loader``
  257. line anymore, and must make sure to remove it.
  258. Events are now ordered using logical time
  259. -----------------------------------------
  260. Keeping physical clocks in perfect sync is impossible, so using
  261. time-stamps to order events in a distributed system isn't reliable.
  262. Celery event messages have included a logical clock value for some time,
  263. but starting with this version that field is also used to order them.
  264. Also, events now record timezone information
  265. by including a new ``utcoffset`` field in the event message.
  266. This is a signed integer telling the difference from UTC time in hours,
  267. so for example, an event sent from the Europe/London timezone in daylight savings
  268. time will have an offset of 1.
  269. :class:`@events.Receiver` will automatically convert the time-stamps
  270. to the local timezone.
  271. .. note::
  272. The logical clock is synchronized with other nodes
  273. in the same cluster (neighbors), so this means that the logical
  274. epoch will start at the point when the first worker in the cluster
  275. starts.
  276. If all of the workers are shutdown the clock value will be lost
  277. and reset to 0. To protect against this, you should specify the
  278. :option:`celery worker --statedb` option such that the worker can
  279. persist the clock value at shutdown.
  280. You may notice that the logical clock is an integer value and
  281. increases very rapidly. Don't worry about the value overflowing
  282. though, as even in the most busy clusters it may take several
  283. millennium before the clock exceeds a 64 bits value.
  284. New worker node name format (``name@host``)
  285. -------------------------------------------
  286. Node names are now constructed by two elements: name and host-name
  287. separated by '@'.
  288. This change was made to more easily identify multiple instances running
  289. on the same machine.
  290. If a custom name isn't specified then the
  291. worker will use the name 'celery' by default, resulting in a
  292. fully qualified node name of 'celery@hostname':
  293. .. code-block:: console
  294. $ celery worker -n example.com
  295. celery@example.com
  296. To also set the name you must include the @:
  297. .. code-block:: console
  298. $ celery worker -n worker1@example.com
  299. worker1@example.com
  300. The worker will identify itself using the fully qualified
  301. node name in events and broadcast messages, so where before
  302. a worker would identify itself as 'worker1.example.com', it'll now
  303. use 'celery@worker1.example.com'.
  304. Remember that the :option:`-n <celery worker -n>` argument also supports
  305. simple variable substitutions, so if the current host-name
  306. is *george.example.com* then the ``%h`` macro will expand into that:
  307. .. code-block:: console
  308. $ celery worker -n worker1@%h
  309. worker1@george.example.com
  310. The available substitutions are as follows:
  311. +---------------+----------------------------------------+
  312. | Variable | Substitution |
  313. +===============+========================================+
  314. | ``%h`` | Full host-name (including domain name) |
  315. +---------------+----------------------------------------+
  316. | ``%d`` | Domain name only |
  317. +---------------+----------------------------------------+
  318. | ``%n`` | Host-name only (without domain name) |
  319. +---------------+----------------------------------------+
  320. | ``%%`` | The character ``%`` |
  321. +---------------+----------------------------------------+
  322. Bound tasks
  323. -----------
  324. The task decorator can now create "bound tasks", which means that the
  325. task will receive the ``self`` argument.
  326. .. code-block:: python
  327. @app.task(bind=True)
  328. def send_twitter_status(self, oauth, tweet):
  329. try:
  330. twitter = Twitter(oauth)
  331. twitter.update_status(tweet)
  332. except (Twitter.FailWhaleError, Twitter.LoginError) as exc:
  333. raise self.retry(exc=exc)
  334. Using *bound tasks* is now the recommended approach whenever
  335. you need access to the task instance or request context.
  336. Previously one would've to refer to the name of the task
  337. instead (``send_twitter_status.retry``), but this could lead to problems
  338. in some configurations.
  339. Mingle: Worker synchronization
  340. ------------------------------
  341. The worker will now attempt to synchronize with other workers in
  342. the same cluster.
  343. Synchronized data currently includes revoked tasks and logical clock.
  344. This only happens at start-up and causes a one second start-up delay
  345. to collect broadcast responses from other workers.
  346. You can disable this bootstep using the
  347. :option:`celery worker --without-mingle` option.
  348. Gossip: Worker <-> Worker communication
  349. ---------------------------------------
  350. Workers are now passively subscribing to worker related events like
  351. heartbeats.
  352. This means that a worker knows what other workers are doing and
  353. can detect if they go offline. Currently this is only used for clock
  354. synchronization, but there are many possibilities for future additions
  355. and you can write extensions that take advantage of this already.
  356. Some ideas include consensus protocols, reroute task to best worker (based on
  357. resource usage or data locality) or restarting workers when they crash.
  358. We believe that although this is a small addition, it opens
  359. amazing possibilities.
  360. You can disable this bootstep using the
  361. :option:`celery worker --without-gossip` option.
  362. Bootsteps: Extending the worker
  363. -------------------------------
  364. By writing bootsteps you can now easily extend the consumer part
  365. of the worker to add additional features, like custom message consumers.
  366. The worker has been using bootsteps for some time, but these were never
  367. documented. In this version the consumer part of the worker
  368. has also been rewritten to use bootsteps and the new :ref:`guide-extending`
  369. guide documents examples extending the worker, including adding
  370. custom message consumers.
  371. See the :ref:`guide-extending` guide for more information.
  372. .. note::
  373. Bootsteps written for older versions won't be compatible
  374. with this version, as the API has changed significantly.
  375. The old API was experimental and internal but should you be so unlucky
  376. to use it then please contact the mailing-list and we'll help you port
  377. the bootstep to the new API.
  378. New RPC result backend
  379. ----------------------
  380. This new experimental version of the ``amqp`` result backend is a good
  381. alternative to use in classical RPC scenarios, where the process that initiates
  382. the task is always the process to retrieve the result.
  383. It uses Kombu to send and retrieve results, and each client
  384. uses a unique queue for replies to be sent to. This avoids
  385. the significant overhead of the original amqp result backend which creates
  386. one queue per task.
  387. By default results sent using this backend won't persist, so they won't
  388. survive a broker restart. You can enable
  389. the :setting:`CELERY_RESULT_PERSISTENT` setting to change that.
  390. .. code-block:: python
  391. CELERY_RESULT_BACKEND = 'rpc'
  392. CELERY_RESULT_PERSISTENT = True
  393. Note that chords are currently not supported by the RPC backend.
  394. Time limits can now be set by the client
  395. ----------------------------------------
  396. Two new options have been added to the Calling API: ``time_limit`` and
  397. ``soft_time_limit``:
  398. .. code-block:: pycon
  399. >>> res = add.apply_async((2, 2), time_limit=10, soft_time_limit=8)
  400. >>> res = add.subtask((2, 2), time_limit=10, soft_time_limit=8).delay()
  401. >>> res = add.s(2, 2).set(time_limit=10, soft_time_limit=8).delay()
  402. Contributed by Mher Movsisyan.
  403. Redis: Broadcast messages and virtual hosts
  404. -------------------------------------------
  405. Broadcast messages are currently seen by all virtual hosts when
  406. using the Redis transport. You can now fix this by enabling a prefix to all channels
  407. so that the messages are separated:
  408. .. code-block:: python
  409. BROKER_TRANSPORT_OPTIONS = {'fanout_prefix': True}
  410. Note that you'll not be able to communicate with workers running older
  411. versions or workers that doesn't have this setting enabled.
  412. This setting will be the default in a future version.
  413. Related to Issue #1490.
  414. :pypi:`pytz` replaces :pypi:`python-dateutil` dependency
  415. --------------------------------------------------------
  416. Celery no longer depends on the :pypi:`python-dateutil` library,
  417. but instead a new dependency on the :pypi:`pytz` library was added.
  418. The :pypi:`pytz` library was already recommended for accurate timezone support.
  419. This also means that dependencies are the same for both Python 2 and
  420. Python 3, and that the :file:`requirements/default-py3k.txt` file has
  421. been removed.
  422. Support for :pypi:`setuptools` extra requirements
  423. -------------------------------------------------
  424. Pip now supports the :pypi:`setuptools` extra requirements format,
  425. so we've removed the old bundles concept, and instead specify
  426. setuptools extras.
  427. You install extras by specifying them inside brackets:
  428. .. code-block:: console
  429. $ pip install celery[redis,mongodb]
  430. The above will install the dependencies for Redis and MongoDB. You can list
  431. as many extras as you want.
  432. .. warning::
  433. You can't use the ``celery-with-*`` packages anymore, as these won't be
  434. updated to use Celery 3.1.
  435. +-------------+-------------------------+---------------------------+
  436. | Extension | Requirement entry | Type |
  437. +=============+=========================+===========================+
  438. | Redis | ``celery[redis]`` | transport, result backend |
  439. +-------------+-------------------------+---------------------------+
  440. | MongoDB | ``celery[mongodb]`` | transport, result backend |
  441. +-------------+-------------------------+---------------------------+
  442. | CouchDB | ``celery[couchdb]`` | transport |
  443. +-------------+-------------------------+---------------------------+
  444. | Beanstalk | ``celery[beanstalk]`` | transport |
  445. +-------------+-------------------------+---------------------------+
  446. | ZeroMQ | ``celery[zeromq]`` | transport |
  447. +-------------+-------------------------+---------------------------+
  448. | Zookeeper | ``celery[zookeeper]`` | transport |
  449. +-------------+-------------------------+---------------------------+
  450. | SQLAlchemy | ``celery[sqlalchemy]`` | transport, result backend |
  451. +-------------+-------------------------+---------------------------+
  452. | librabbitmq | ``celery[librabbitmq]`` | transport (C amqp client) |
  453. +-------------+-------------------------+---------------------------+
  454. The complete list with examples is found in the :ref:`bundles` section.
  455. ``subtask.__call__()`` now executes the task directly
  456. -----------------------------------------------------
  457. A misunderstanding led to ``Signature.__call__`` being an alias of
  458. ``.delay`` but this doesn't conform to the calling API of ``Task`` which
  459. calls the underlying task method.
  460. This means that:
  461. .. code-block:: python
  462. @app.task
  463. def add(x, y):
  464. return x + y
  465. add.s(2, 2)()
  466. now does the same as calling the task directly:
  467. .. code-block:: pycon
  468. >>> add(2, 2)
  469. In Other News
  470. -------------
  471. - Now depends on :ref:`Kombu 3.0 <kombu:version-3.0.0>`.
  472. - Now depends on :pypi:`billiard` version 3.3.
  473. - Worker will now crash if running as the root user with pickle enabled.
  474. - Canvas: ``group.apply_async`` and ``chain.apply_async`` no longer starts
  475. separate task.
  476. That the group and chord primitives supported the "calling API" like other
  477. subtasks was a nice idea, but it was useless in practice and often
  478. confused users. If you still want this behavior you can define a
  479. task to do it for you.
  480. - New method ``Signature.freeze()`` can be used to "finalize"
  481. signatures/subtask.
  482. Regular signature:
  483. .. code-block:: pycon
  484. >>> s = add.s(2, 2)
  485. >>> result = s.freeze()
  486. >>> result
  487. <AsyncResult: ffacf44b-f8a1-44e9-80a3-703150151ef2>
  488. >>> s.delay()
  489. <AsyncResult: ffacf44b-f8a1-44e9-80a3-703150151ef2>
  490. Group:
  491. .. code-block:: pycon
  492. >>> g = group(add.s(2, 2), add.s(4, 4))
  493. >>> result = g.freeze()
  494. <GroupResult: e1094b1d-08fc-4e14-838e-6d601b99da6d [
  495. 70c0fb3d-b60e-4b22-8df7-aa25b9abc86d,
  496. 58fcd260-2e32-4308-a2ea-f5be4a24f7f4]>
  497. >>> g()
  498. <GroupResult: e1094b1d-08fc-4e14-838e-6d601b99da6d [70c0fb3d-b60e-4b22-8df7-aa25b9abc86d, 58fcd260-2e32-4308-a2ea-f5be4a24f7f4]>
  499. - Chord exception behavior defined (Issue #1172).
  500. From this version the chord callback will change state to FAILURE
  501. when a task part of a chord raises an exception.
  502. See more at :ref:`chord-errors`.
  503. - New ability to specify additional command line options
  504. to the worker and beat programs.
  505. The :attr:`@user_options` attribute can be used
  506. to add additional command-line arguments, and expects
  507. :mod:`optparse`-style options:
  508. .. code-block:: python
  509. from celery import Celery
  510. from celery.bin import Option
  511. app = Celery()
  512. app.user_options['worker'].add(
  513. Option('--my-argument'),
  514. )
  515. See the :ref:`guide-extending` guide for more information.
  516. - All events now include a ``pid`` field, which is the process id of the
  517. process that sent the event.
  518. - Event heartbeats are now calculated based on the time when the event
  519. was received by the monitor, and not the time reported by the worker.
  520. This means that a worker with an out-of-sync clock will no longer
  521. show as 'Offline' in monitors.
  522. A warning is now emitted if the difference between the senders
  523. time and the internal time is greater than 15 seconds, suggesting
  524. that the clocks are out of sync.
  525. - Monotonic clock support.
  526. A monotonic clock is now used for timeouts and scheduling.
  527. The monotonic clock function is built-in starting from Python 3.4,
  528. but we also have fallback implementations for Linux and macOS.
  529. - :program:`celery worker` now supports a new
  530. :option:`--detach <celery worker --detach>` argument to start
  531. the worker as a daemon in the background.
  532. - :class:`@events.Receiver` now sets a ``local_received`` field for incoming
  533. events, which is set to the time of when the event was received.
  534. - :class:`@events.Dispatcher` now accepts a ``groups`` argument
  535. which decides a white-list of event groups that'll be sent.
  536. The type of an event is a string separated by '-', where the part
  537. before the first '-' is the group. Currently there are only
  538. two groups: ``worker`` and ``task``.
  539. A dispatcher instantiated as follows:
  540. .. code-block:: pycon
  541. >>> app.events.Dispatcher(connection, groups=['worker'])
  542. will only send worker related events and silently drop any attempts
  543. to send events related to any other group.
  544. - New :setting:`BROKER_FAILOVER_STRATEGY` setting.
  545. This setting can be used to change the transport fail-over strategy,
  546. can either be a callable returning an iterable or the name of a
  547. Kombu built-in failover strategy. Default is "round-robin".
  548. Contributed by Matt Wise.
  549. - ``Result.revoke`` will no longer wait for replies.
  550. You can add the ``reply=True`` argument if you really want to wait for
  551. responses from the workers.
  552. - Better support for link and link_error tasks for chords.
  553. Contributed by Steeve Morin.
  554. - Worker: Now emits warning if the :setting:`CELERYD_POOL` setting is set
  555. to enable the eventlet/gevent pools.
  556. The `-P` option should always be used to select the eventlet/gevent pool
  557. to ensure that the patches are applied as early as possible.
  558. If you start the worker in a wrapper (like Django's :file:`manage.py`)
  559. then you must apply the patches manually, for example by creating an alternative
  560. wrapper that monkey patches at the start of the program before importing
  561. any other modules.
  562. - There's a now an 'inspect clock' command which will collect the current
  563. logical clock value from workers.
  564. - `celery inspect stats` now contains the process id of the worker's main
  565. process.
  566. Contributed by Mher Movsisyan.
  567. - New remote control command to dump a workers configuration.
  568. Example:
  569. .. code-block:: console
  570. $ celery inspect conf
  571. Configuration values will be converted to values supported by JSON
  572. where possible.
  573. Contributed by Mher Movsisyan.
  574. - New settings :setting:`CELERY_EVENT_QUEUE_TTL` and
  575. :setting:`CELERY_EVENT_QUEUE_EXPIRES`.
  576. These control when a monitors event queue is deleted, and for how long
  577. events published to that queue will be visible. Only supported on
  578. RabbitMQ.
  579. - New Couchbase result backend.
  580. This result backend enables you to store and retrieve task results
  581. using `Couchbase`_.
  582. See :ref:`conf-couchbase-result-backend` for more information
  583. about configuring this result backend.
  584. Contributed by Alain Masiero.
  585. .. _`Couchbase`: https://www.couchbase.com
  586. - CentOS init-script now supports starting multiple worker instances.
  587. See the script header for details.
  588. Contributed by Jonathan Jordan.
  589. - ``AsyncResult.iter_native`` now sets default interval parameter to 0.5
  590. Fix contributed by Idan Kamara
  591. - New setting :setting:`BROKER_LOGIN_METHOD`.
  592. This setting can be used to specify an alternate login method
  593. for the AMQP transports.
  594. Contributed by Adrien Guinet
  595. - The ``dump_conf`` remote control command will now give the string
  596. representation for types that aren't JSON compatible.
  597. - Function `celery.security.setup_security` is now :func:`@setup_security`.
  598. - Task retry now propagates the message expiry value (Issue #980).
  599. The value is forwarded at is, so the expiry time won't change.
  600. To update the expiry time you'd've to pass a new expires
  601. argument to ``retry()``.
  602. - Worker now crashes if a channel error occurs.
  603. Channel errors are transport specific and is the list of exceptions
  604. returned by ``Connection.channel_errors``.
  605. For RabbitMQ this means that Celery will crash if the equivalence
  606. checks for one of the queues in :setting:`CELERY_QUEUES` mismatches, which
  607. makes sense since this is a scenario where manual intervention is
  608. required.
  609. - Calling ``AsyncResult.get()`` on a chain now propagates errors for previous
  610. tasks (Issue #1014).
  611. - The parent attribute of ``AsyncResult`` is now reconstructed when using JSON
  612. serialization (Issue #1014).
  613. - Worker disconnection logs are now logged with severity warning instead of
  614. error.
  615. Contributed by Chris Adams.
  616. - ``events.State`` no longer crashes when it receives unknown event types.
  617. - SQLAlchemy Result Backend: New :setting:`CELERY_RESULT_DB_TABLENAMES`
  618. setting can be used to change the name of the database tables used.
  619. Contributed by Ryan Petrello.
  620. - SQLAlchemy Result Backend: Now calls ``enginge.dispose`` after fork
  621. (Issue #1564).
  622. If you create your own SQLAlchemy engines then you must also
  623. make sure that these are closed after fork in the worker:
  624. .. code-block:: python
  625. from multiprocessing.util import register_after_fork
  626. engine = create_engine(*engine_args)
  627. register_after_fork(engine, engine.dispose)
  628. - A stress test suite for the Celery worker has been written.
  629. This is located in the ``funtests/stress`` directory in the git
  630. repository. There's a README file there to get you started.
  631. - The logger named ``celery.concurrency`` has been renamed to ``celery.pool``.
  632. - New command line utility ``celery graph``.
  633. This utility creates graphs in GraphViz dot format.
  634. You can create graphs from the currently installed bootsteps:
  635. .. code-block:: console
  636. # Create graph of currently installed bootsteps in both the worker
  637. # and consumer name-spaces.
  638. $ celery graph bootsteps | dot -T png -o steps.png
  639. # Graph of the consumer name-space only.
  640. $ celery graph bootsteps consumer | dot -T png -o consumer_only.png
  641. # Graph of the worker name-space only.
  642. $ celery graph bootsteps worker | dot -T png -o worker_only.png
  643. Or graphs of workers in a cluster:
  644. .. code-block:: console
  645. # Create graph from the current cluster
  646. $ celery graph workers | dot -T png -o workers.png
  647. # Create graph from a specified list of workers
  648. $ celery graph workers nodes:w1,w2,w3 | dot -T png workers.png
  649. # also specify the number of threads in each worker
  650. $ celery graph workers nodes:w1,w2,w3 threads:2,4,6
  651. # …also specify the broker and backend URLs shown in the graph
  652. $ celery graph workers broker:amqp:// backend:redis://
  653. # …also specify the max number of workers/threads shown (wmax/tmax),
  654. # enumerating anything that exceeds that number.
  655. $ celery graph workers wmax:10 tmax:3
  656. - Changed the way that app instances are pickled.
  657. Apps can now define a ``__reduce_keys__`` method that's used instead
  658. of the old ``AppPickler`` attribute. For example, if your app defines a custom
  659. 'foo' attribute that needs to be preserved when pickling you can define
  660. a ``__reduce_keys__`` as such:
  661. .. code-block:: python
  662. import celery
  663. class Celery(celery.Celery):
  664. def __init__(self, *args, **kwargs):
  665. super(Celery, self).__init__(*args, **kwargs)
  666. self.foo = kwargs.get('foo')
  667. def __reduce_keys__(self):
  668. return super(Celery, self).__reduce_keys__().update(
  669. foo=self.foo,
  670. )
  671. This is a much more convenient way to add support for pickling custom
  672. attributes. The old ``AppPickler`` is still supported but its use is
  673. discouraged and we would like to remove it in a future version.
  674. - Ability to trace imports for debugging purposes.
  675. The :envvar:`C_IMPDEBUG` can be set to trace imports as they
  676. occur:
  677. .. code-block:: console
  678. $ C_IMDEBUG=1 celery worker -l info
  679. .. code-block:: console
  680. $ C_IMPDEBUG=1 celery shell
  681. - Message headers now available as part of the task request.
  682. Example adding and retrieving a header value:
  683. .. code-block:: python
  684. @app.task(bind=True)
  685. def t(self):
  686. return self.request.headers.get('sender')
  687. >>> t.apply_async(headers={'sender': 'George Costanza'})
  688. - New :signal:`before_task_publish` signal dispatched before a task message
  689. is sent and can be used to modify the final message fields (Issue #1281).
  690. - New :signal:`after_task_publish` signal replaces the old :signal:`task_sent`
  691. signal.
  692. The :signal:`task_sent` signal is now deprecated and shouldn't be used.
  693. - New :signal:`worker_process_shutdown` signal is dispatched in the
  694. prefork pool child processes as they exit.
  695. Contributed by Daniel M Taub.
  696. - ``celery.platforms.PIDFile`` renamed to :class:`celery.platforms.Pidfile`.
  697. - MongoDB Backend: Can now be configured using a URL:
  698. - MongoDB Backend: No longer using deprecated ``pymongo.Connection``.
  699. - MongoDB Backend: Now disables ``auto_start_request``.
  700. - MongoDB Backend: Now enables ``use_greenlets`` when eventlet/gevent is used.
  701. - ``subtask()`` / ``maybe_subtask()`` renamed to
  702. ``signature()``/``maybe_signature()``.
  703. Aliases still available for backwards compatibility.
  704. - The ``correlation_id`` message property is now automatically set to the
  705. id of the task.
  706. - The task message ``eta`` and ``expires`` fields now includes timezone
  707. information.
  708. - All result backends ``store_result``/``mark_as_*`` methods must now accept
  709. a ``request`` keyword argument.
  710. - Events now emit warning if the broken ``yajl`` library is used.
  711. - The :signal:`celeryd_init` signal now takes an extra keyword argument:
  712. ``option``.
  713. This is the mapping of parsed command line arguments, and can be used to
  714. prepare new preload arguments (``app.user_options['preload']``).
  715. - New callback: :meth:`@on_configure`.
  716. This callback is called when an app is about to be configured (a
  717. configuration key is required).
  718. - Worker: No longer forks on :sig:`HUP`.
  719. This means that the worker will reuse the same pid for better
  720. support with external process supervisors.
  721. Contributed by Jameel Al-Aziz.
  722. - Worker: The log message ``Got task from broker …`` was changed to
  723. ``Received task …``.
  724. - Worker: The log message ``Skipping revoked task …`` was changed
  725. to ``Discarding revoked task …``.
  726. - Optimization: Improved performance of ``ResultSet.join_native()``.
  727. Contributed by Stas Rudakou.
  728. - The :signal:`task_revoked` signal now accepts new ``request`` argument
  729. (Issue #1555).
  730. The revoked signal is dispatched after the task request is removed from
  731. the stack, so it must instead use the
  732. :class:`~celery.worker.request.Request` object to get information
  733. about the task.
  734. - Worker: New :option:`-X <celery worker -X>` command line argument to
  735. exclude queues (Issue #1399).
  736. The :option:`-X <celery worker -X>` argument is the inverse of the
  737. :option:`-Q <celery worker -Q>` argument and accepts a list of queues
  738. to exclude (not consume from):
  739. .. code-block:: console
  740. # Consume from all queues in CELERY_QUEUES, but not the 'foo' queue.
  741. $ celery worker -A proj -l info -X foo
  742. - Adds :envvar:`C_FAKEFORK` environment variable for simple
  743. init-script/:program:`celery multi` debugging.
  744. This means that you can now do:
  745. .. code-block:: console
  746. $ C_FAKEFORK=1 celery multi start 10
  747. or:
  748. .. code-block:: console
  749. $ C_FAKEFORK=1 /etc/init.d/celeryd start
  750. to avoid the daemonization step to see errors that aren't visible
  751. due to missing stdout/stderr.
  752. A ``dryrun`` command has been added to the generic init-script that
  753. enables this option.
  754. - New public API to push and pop from the current task stack:
  755. :func:`celery.app.push_current_task` and
  756. :func:`celery.app.pop_current_task``.
  757. - ``RetryTaskError`` has been renamed to :exc:`~celery.exceptions.Retry`.
  758. The old name is still available for backwards compatibility.
  759. - New semi-predicate exception :exc:`~celery.exceptions.Reject`.
  760. This exception can be raised to ``reject``/``requeue`` the task message,
  761. see :ref:`task-semipred-reject` for examples.
  762. - :ref:`Semipredicates <task-semipredicates>` documented: (Retry/Ignore/Reject).
  763. .. _v310-removals:
  764. Scheduled Removals
  765. ==================
  766. - The ``BROKER_INSIST`` setting and the ``insist`` argument
  767. to ``~@connection`` is no longer supported.
  768. - The ``CELERY_AMQP_TASK_RESULT_CONNECTION_MAX`` setting is no longer
  769. supported.
  770. Use :setting:`BROKER_POOL_LIMIT` instead.
  771. - The ``CELERY_TASK_ERROR_WHITELIST`` setting is no longer supported.
  772. You should set the :class:`~celery.utils.mail.ErrorMail` attribute
  773. of the task class instead. You can also do this using
  774. :setting:`CELERY_ANNOTATIONS`:
  775. .. code-block:: python
  776. from celery import Celery
  777. from celery.utils.mail import ErrorMail
  778. class MyErrorMail(ErrorMail):
  779. whitelist = (KeyError, ImportError)
  780. def should_send(self, context, exc):
  781. return isinstance(exc, self.whitelist)
  782. app = Celery()
  783. app.conf.CELERY_ANNOTATIONS = {
  784. '*': {
  785. 'ErrorMail': MyErrorMails,
  786. }
  787. }
  788. - Functions that creates a broker connections no longer
  789. supports the ``connect_timeout`` argument.
  790. This can now only be set using the :setting:`BROKER_CONNECTION_TIMEOUT`
  791. setting. This is because functions no longer create connections
  792. directly, but instead get them from the connection pool.
  793. - The ``CELERY_AMQP_TASK_RESULT_EXPIRES`` setting is no longer supported.
  794. Use :setting:`CELERY_TASK_RESULT_EXPIRES` instead.
  795. .. _v310-deprecations:
  796. Deprecation Time-line Changes
  797. =============================
  798. See the :ref:`deprecation-timeline`.
  799. .. _v310-fixes:
  800. Fixes
  801. =====
  802. - AMQP Backend: join didn't convert exceptions when using the json
  803. serializer.
  804. - Non-abstract task classes are now shared between apps (Issue #1150).
  805. Note that non-abstract task classes shouldn't be used in the
  806. new API. You should only create custom task classes when you
  807. use them as a base class in the ``@task`` decorator.
  808. This fix ensure backwards compatibility with older Celery versions
  809. so that non-abstract task classes works even if a module is imported
  810. multiple times so that the app is also instantiated multiple times.
  811. - Worker: Workaround for Unicode errors in logs (Issue #427).
  812. - Task methods: ``.apply_async`` now works properly if args list is None
  813. (Issue #1459).
  814. - Eventlet/gevent/solo/threads pools now properly handles :exc:`BaseException`
  815. errors raised by tasks.
  816. - :control:`autoscale` and :control:`pool_grow`/:control:`pool_shrink` remote
  817. control commands will now also automatically increase and decrease the
  818. consumer prefetch count.
  819. Fix contributed by Daniel M. Taub.
  820. - ``celery control pool_`` commands didn't coerce string arguments to int.
  821. - Redis/Cache chords: Callback result is now set to failure if the group
  822. disappeared from the database (Issue #1094).
  823. - Worker: Now makes sure that the shutdown process isn't initiated more
  824. than once.
  825. - Programs: :program:`celery multi` now properly handles both ``-f`` and
  826. :option:`--logfile <celery worker --logfile>` options (Issue #1541).
  827. .. _v310-internal:
  828. Internal changes
  829. ================
  830. - Module ``celery.task.trace`` has been renamed to :mod:`celery.app.trace`.
  831. - Module ``celery.concurrency.processes`` has been renamed to
  832. :mod:`celery.concurrency.prefork`.
  833. - Classes that no longer fall back to using the default app:
  834. - Result backends (:class:`celery.backends.base.BaseBackend`)
  835. - :class:`celery.worker.WorkController`
  836. - :class:`celery.worker.Consumer`
  837. - :class:`celery.worker.request.Request`
  838. This means that you have to pass a specific app when instantiating
  839. these classes.
  840. - ``EventDispatcher.copy_buffer`` renamed to
  841. :meth:`@events.Dispatcher.extend_buffer`.
  842. - Removed unused and never documented global instance
  843. ``celery.events.state.state``.
  844. - :class:`@events.Receiver` is now a :class:`kombu.mixins.ConsumerMixin`
  845. subclass.
  846. - :class:`celery.apps.worker.Worker` has been refactored as a subclass of
  847. :class:`celery.worker.WorkController`.
  848. This removes a lot of duplicate functionality.
  849. - The ``Celery.with_default_connection`` method has been removed in favor
  850. of ``with app.connection_or_acquire`` (:meth:`@connection_or_acquire`)
  851. - The ``celery.results.BaseDictBackend`` class has been removed and is replaced by
  852. :class:`celery.results.BaseBackend`.