whatsnew-3.0.rst 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  1. .. _whatsnew-3.0:
  2. ===========================================
  3. What's new in Celery 3.0 (Chiastic Slide)
  4. ===========================================
  5. Celery is a simple, flexible and reliable distributed system to
  6. process vast amounts of messages, while providing operations with
  7. the tools required to maintain such a system.
  8. It's a task queue with focus on real-time processing, while also
  9. supporting task scheduling.
  10. Celery has a large and diverse community of users and contributors,
  11. you should come join us :ref:`on IRC <irc-channel>`
  12. or :ref:`our mailing-list <mailing-list>`.
  13. To read more about Celery you should go read the :ref:`introduction <intro>`.
  14. While this version is backward compatible with previous versions
  15. it's important that you read the following section.
  16. If you use Celery in combination with Django you must also
  17. read the `django-celery changelog`_ and upgrade to `django-celery 3.0`_.
  18. This version is officially supported on CPython 2.5, 2.6, 2.7, 3.2 and 3.3,
  19. as well as PyPy and Jython.
  20. Highlights
  21. ==========
  22. .. topic:: Overview
  23. - A new and improved API, that is both simpler and more powerful.
  24. Everyone must read the new :ref:`first-steps` tutorial,
  25. and the new :ref:`next-steps` tutorial. Oh, and
  26. why not reread the user guide while you're at it :)
  27. There are no current plans to deprecate the old API,
  28. so you don't have to be in a hurry to port your applications.
  29. - Over 600 commits, 30k additions/36k deletions.
  30. In comparison from 1.0 to 2.0 had 18k additions/8k deletions.
  31. - The worker is now thread-less, giving great performance improvements.
  32. - The new "Canvas" makes it easy to define complex workflows.
  33. Ever wanted to chain tasks together? This is possible, but
  34. not just that, now you can even chain together groups and chords,
  35. or even combine multiple chains.
  36. Read more in the :ref:`Canvas <guide-canvas>` user guide.
  37. - All of Celery's command line programs are now available from a single
  38. :program:`celery` umbrella command.
  39. - This is the last version to support Python 2.5.
  40. Starting with Celery 3.1, Python 2.6 or later is required.
  41. - Support for the new librabbitmq C client.
  42. Celery will automatically use the :mod:`librabbitmq` module
  43. if installed, which is a very fast and memory-optimized
  44. replacement for the amqplib module.
  45. - Redis support is more reliable with improved ack emulation.
  46. - Celery now always uses UTC
  47. .. _`website`: http://celeryproject.org/
  48. .. _`django-celery changelog`: http://bit.ly/djcelery-26-changelog
  49. .. _`django-celery 3.0`: http://pypi.python.org/pypi/django-celery/
  50. .. contents::
  51. :local:
  52. :depth: 2
  53. .. _v260-important:
  54. Important Notes
  55. ===============
  56. Broadcast exchanges renamed
  57. ---------------------------
  58. The workers remote control command exchanges has been renamed
  59. (a new pidbox name), this is because the ``auto_delete`` flag on the exchanges
  60. has been removed, and that makes it incompatible with earlier versions.
  61. You can manually delete the old exchanges if you want,
  62. using the :program:`celery amqp` command (previously called ``camqadm``)::
  63. $ celery amqp exchange.delete celeryd.pidbox
  64. $ celery amqp exchange.delete reply.celeryd.pidbox
  65. Eventloop
  66. ---------
  67. The worker is now running *without threads* when used with RabbitMQ (AMQP),
  68. or Redis as a broker, resulting in:
  69. - Much better overall performance.
  70. - Fixes several edge case race conditions.
  71. - Sub-millisecond timer precision.
  72. - Faster shutdown times.
  73. The transports supported are: ``amqplib``, ``librabbitmq``, and ``redis``
  74. Hopefully this can be extended to include additional broker transports
  75. in the future.
  76. For increased reliability the :setting:`CELERY_FORCE_EXECV` setting is enabled
  77. by default if the eventloop is not used.
  78. New ``celery`` umbrella command
  79. -------------------------------
  80. All Celery's command line programs are now available from a single
  81. :program:`celery` umbrella command.
  82. You can see a list of subcommands and options by running::
  83. $ celery help
  84. Commands include:
  85. - ``celery worker`` (previously ``celeryd``).
  86. - ``celery beat`` (previously ``celerybeat``).
  87. - ``celery amqp`` (previously ``camqadm``).
  88. The old programs are still available (``celeryd``, ``celerybeat``, etc),
  89. but you are discouraged from using them.
  90. Now depends on :mod:`billiard`.
  91. -------------------------------
  92. Billiard is a fork of the multiprocessing containing
  93. the no-execv patch by sbt (http://bugs.python.org/issue8713),
  94. and also contains the pool improvements previously located in Celery.
  95. This fork was necessary as changes to the C extension code was required
  96. for the no-execv patch to work.
  97. - Issue #625
  98. - Issue #627
  99. - Issue #640
  100. - `django-celery #122 <http://github.com/celery/django-celery/issues/122`
  101. - `django-celery #124 <http://github.com/celery/django-celery/issues/122`
  102. Last version to support Python 2.5
  103. ----------------------------------
  104. The 3.0 series will be last version to support Python 2.5,
  105. and starting from 3.1 Python 2.6 and later will be required.
  106. With several other distributions taking the step to discontinue
  107. Python 2.5 support, we feel that it is time too.
  108. Python 2.6 should be widely available at this point, and we urge
  109. you to upgrade, but if that is not possible you still have the option
  110. to continue using the Celery 3.0, and important bug fixes
  111. introduced in Celery 3.1 will be back-ported to Celery 3.0 upon request.
  112. UTC timezone is now used
  113. ------------------------
  114. This means that ETA/countdown in messages are not compatible with Celery
  115. versions prior to 2.5.
  116. You can disable UTC and revert back to old local time by setting
  117. the :setting:`CELERY_ENABLE_UTC` setting.
  118. .. _v260-news:
  119. News
  120. ====
  121. Chaining Tasks
  122. --------------
  123. Tasks can now have callbacks and errbacks, and dependencies are recorded
  124. - The task message format have been updated with two new extension keys
  125. Both keys can be empty/undefined or a list of subtasks.
  126. - ``callbacks``
  127. Applied if the task exits successfully, with the result
  128. of the task as an argument.
  129. - ``errbacks``
  130. Applied if an error occurred while executing the task,
  131. with the uuid of the task as an argument. Since it may not be possible
  132. to serialize the exception instance, it passes the uuid of the task
  133. instead. The uuid can then be used to retrieve the exception and
  134. traceback of the task from the result backend.
  135. - ``link`` and ``link_error`` keyword arguments has been added
  136. to ``apply_async``.
  137. These add callbacks and errbacks to the task, and
  138. you can read more about them at :ref:`calling-links`.
  139. - We now track what subtasks a task sends, and some result backends
  140. supports retrieving this information.
  141. - task.request.children
  142. Contains the result instances of the subtasks
  143. the currently executing task has applied.
  144. - AsyncResult.children
  145. Returns the tasks dependencies, as a list of
  146. ``AsyncResult``/``ResultSet`` instances.
  147. - AsyncResult.iterdeps
  148. Recursively iterates over the tasks dependencies,
  149. yielding `(parent, node)` tuples.
  150. Raises IncompleteStream if any of the dependencies
  151. has not returned yet.
  152. - AsyncResult.graph
  153. A ``DependencyGraph`` of the tasks dependencies.
  154. This can also be used to convert to dot format:
  155. .. code-block:: python
  156. with open('graph.dot') as fh:
  157. result.graph.to_dot(fh)
  158. which can than be used to produce an image::
  159. $ dot -Tpng graph.dot -o graph.png
  160. - A new special subtask called ``chain`` is also included::
  161. .. code-block:: python
  162. >>> from celery import chain
  163. # (2 + 2) * 8 / 2
  164. >>> res = chain(add.subtask((2, 2)),
  165. mul.subtask((8, )),
  166. div.subtask((2,))).apply_async()
  167. >>> res.get() == 16
  168. >>> res.parent.get() == 32
  169. >>> res.parent.parent.get() == 4
  170. - Adds :meth:`AsyncResult.get_leaf`
  171. Waits and returns the result of the leaf subtask.
  172. That is the last node found when traversing the graph,
  173. but this means that the graph can be 1-dimensional only (in effect
  174. a list).
  175. - Adds ``subtask.link(subtask)`` + ``subtask.link_error(subtask)``
  176. Shortcut to ``s.options.setdefault('link', []).append(subtask)``
  177. - Adds ``subtask.flatten_links()``
  178. Returns a flattened list of all dependencies (recursively)
  179. `group`/`chord`/`chain` are now subtasks
  180. ----------------------------------------
  181. - group is no longer an alias to TaskSet, but new alltogether,
  182. since it was very difficult to migrate the TaskSet class to become
  183. a subtask.
  184. - A new shortcut has been added to tasks::
  185. >>> task.s(arg1, arg2, kw=1)
  186. as a shortcut to::
  187. >>> task.subtask((arg1, arg2), {'kw': 1})
  188. - Tasks can be chained by using the ``|`` operator::
  189. >>> (add.s(2, 2), pow.s(2)).apply_async()
  190. - Subtasks can be "evaluated" using the ``~`` operator::
  191. >>> ~add.s(2, 2)
  192. 4
  193. >>> ~(add.s(2, 2) | pow.s(2))
  194. is the same as::
  195. >>> chain(add.s(2, 2), pow.s(2)).apply_async().get()
  196. - A new subtask_type key has been added to the subtask dicts
  197. This can be the string "chord", "group", "chain", "chunks",
  198. "xmap", or "xstarmap".
  199. - maybe_subtask now uses subtask_type to reconstruct
  200. the object, to be used when using non-pickle serializers.
  201. - The logic for these operations have been moved to dedicated
  202. tasks celery.chord, celery.chain and celery.group.
  203. - subtask no longer inherits from AttributeDict.
  204. It's now a pure dict subclass with properties for attribute
  205. access to the relevant keys.
  206. - The repr's now outputs how the sequence would like imperatively::
  207. >>> from celery import chord
  208. >>> (chord([add.s(i, i) for i in xrange(10)], xsum.s())
  209. | pow.s(2))
  210. tasks.xsum([tasks.add(0, 0),
  211. tasks.add(1, 1),
  212. tasks.add(2, 2),
  213. tasks.add(3, 3),
  214. tasks.add(4, 4),
  215. tasks.add(5, 5),
  216. tasks.add(6, 6),
  217. tasks.add(7, 7),
  218. tasks.add(8, 8),
  219. tasks.add(9, 9)]) | tasks.pow(2)
  220. New remote control commands
  221. ---------------------------
  222. These commands were previously experimental, but they have proven
  223. stable and is now documented as part of the offical API.
  224. - ``add_consumer``/``cancel_consumer``
  225. Tells workers to consume from a new queue, or cancel consuming from a
  226. queue. This command has also been changed so that the worker remembers
  227. the queues added, so that the change will persist even if
  228. the connection is re-connected.
  229. These commands are available programmatically as
  230. :meth:`@control.add_consumer` / :meth:`@control.cancel_consumer`:
  231. .. code-block:: python
  232. >>> celery.control.add_consumer(queue_name,
  233. ... destination=['w1.example.com'])
  234. >>> celery.control.cancel_consumer(queue_name,
  235. ... destination=['w1.example.com'])
  236. or using the :program:`celery control` command::
  237. $ celery control -d w1.example.com add_consumer queue
  238. $ celery control -d w1.example.com cancel_consumer queue
  239. .. note::
  240. Remember that a control command without *destination* will be
  241. sent to **all workers**.
  242. - ``autoscale``
  243. Tells workers with `--autoscale` enabled to change autoscale
  244. max/min concurrency settings.
  245. This command is available programmatically as :meth:`@control.autoscale`:
  246. .. code-block:: python
  247. >>> celery.control.autoscale(max=10, min=5,
  248. ... destination=['w1.example.com'])
  249. or using the :program:`celery control` command::
  250. $ celery control -d w1.example.com autoscale 10 5
  251. - ``pool_grow``/``pool_shrink``
  252. Tells workers to add or remove pool processes.
  253. These commands are available programmatically as
  254. :meth:`@control.pool_grow` / :meth:`@control.pool_shrink`:
  255. .. code-block:: python
  256. >>> celery.control.pool_grow(2, destination=['w1.example.com'])
  257. >>> celery.contorl.pool_shrink(2, destination=['w1.example.com'])
  258. or using the :program:`celery control` command::
  259. $ celery control -d w1.example.com pool_grow 2
  260. $ celery control -d w1.example.com pool_shrink 2
  261. - :program:`celery control` now supports ``rate_limit`` & ``time_limit``
  262. commands.
  263. See ``celery control --help`` for details.
  264. Crontab now supports Day of Month, and Month of Year arguments
  265. --------------------------------------------------------------
  266. See the updated list of examples at :ref:`beat-crontab`.
  267. Immutable subtasks
  268. ------------------
  269. ``subtask``'s can now be immutable, which means that the arguments
  270. will not be modified when calling callbacks::
  271. >>> chain(add.s(2, 2), clear_static_electricity.si())
  272. means it will not receive the argument of the parent task,
  273. and ``.si()`` is a shortcut to::
  274. >>> clear_static_electricity.subtask(immutable=True)
  275. Logging Improvements
  276. --------------------
  277. Logging support now conforms better with best practices.
  278. - Classes used by the worker no longer uses app.get_default_logger, but uses
  279. `celery.utils.log.get_logger` which simply gets the logger not setting the
  280. level, and adds a NullHandler.
  281. - Loggers are no longer passed around, instead every module using logging
  282. defines a module global logger that is used throughout.
  283. - All loggers inherit from a common logger called "celery".
  284. - Before task.get_logger would setup a new logger for every task,
  285. and even set the loglevel. This is no longer the case.
  286. - Instead all task loggers now inherit from a common "celery.task" logger
  287. that is set up when programs call `setup_logging_subsystem`.
  288. - Instead of using LoggerAdapter to augment the formatter with
  289. the task_id and task_name field, the task base logger now use
  290. a special formatter adding these values at runtime from the
  291. currently executing task.
  292. - In fact, ``task.get_logger`` is no longer recommended, it is better
  293. to add a module-level logger to your tasks module.
  294. For example, like this:
  295. .. code-block:: python
  296. from celery.utils.log import get_task_logger
  297. logger = get_task_logger(__name__)
  298. @celery.task()
  299. def add(x, y):
  300. logger.debug('Adding %r + %r' % (x, y))
  301. return x + y
  302. The resulting logger will then inherit from the ``"celery.task"`` logger
  303. so that the current task name and id is included in logging output.
  304. - Redirected output from stdout/stderr is now logged to a "celery.redirected"
  305. logger.
  306. - In addition a few warnings.warn have been replaced with logger.warn.
  307. - Now avoids the 'no handlers for logger multiprocessing' warning
  308. Task registry no longer global
  309. ------------------------------
  310. Every Celery instance now has its own task registry.
  311. You can make apps share registries by specifying it::
  312. >>> app1 = Celery()
  313. >>> app2 = Celery(tasks=app1.tasks)
  314. Note that tasks are shared between registries by default, so that
  315. tasks will be added to every subsequently created task registry.
  316. As an alternative tasks can be private to specific task registries
  317. by setting the ``shared`` argument to the ``@task`` decorator::
  318. @celery.task(shared=False)
  319. def add(x, y):
  320. return x + y
  321. Abstract tasks are now lazily bound.
  322. ------------------------------------
  323. The :class:`~celery.task.Task` class is no longer bound to an app
  324. by default, it will first be bound (and configured) when
  325. a concrete subclass is created.
  326. This means that you can safely import and make task base classes,
  327. without also initializing the app environment::
  328. from celery.task import Task
  329. class DebugTask(Task):
  330. abstract = True
  331. def __call__(self, *args, **kwargs):
  332. print('CALLING %r' % (self, ))
  333. return self.run(*args, **kwargs)
  334. >>> DebugTask
  335. <unbound DebugTask>
  336. >>> @celery1.task(base=DebugTask)
  337. ... def add(x, y):
  338. ... return x + y
  339. >>> add.__class__
  340. <class add of <Celery default:0x101510d10>>
  341. Lazy task decorators
  342. --------------------
  343. The ``@task`` decorator is now lazy when used with custom apps.
  344. That is, if ``accept_magic_kwargs`` is enabled (herby called "compat mode"), the task
  345. decorator executes inline like before, however for custom apps the @task
  346. decorator now returns a special PromiseProxy object that is only evaluated
  347. on access.
  348. All promises will be evaluated when `app.finalize` is called, or implicitly
  349. when the task registry is first used.
  350. Smart `--app` option
  351. --------------------
  352. The :option:`--app` option now 'auto-detects'
  353. - If the provided path is a module it tries to get an
  354. attribute named 'celery'.
  355. - If the provided path is a package it tries
  356. to import a submodule named 'celery',
  357. and get the celery attribute from that module.
  358. E.g. if you have a project named 'proj' where the
  359. celery app is located in 'from proj.celery import celery',
  360. then the following will be equivalent::
  361. $ celery worker --app=proj
  362. $ celery worker --app=proj.celery:
  363. $ celery worker --app=proj.celery:celery
  364. In Other News
  365. -------------
  366. - New :setting:`CELERYD_WORKER_LOST_WAIT` to control the timeout in
  367. seconds before :exc:`billiard.WorkerLostError` is raised
  368. when a worker can not be signalled (Issue #595).
  369. Contributed by Brendon Crawford.
  370. - Redis event monitor queues are now automatically deleted (Issue #436).
  371. - App instance factory methods have been converted to be cached
  372. descriptors that creates a new subclass on access.
  373. This means that e.g. ``celery.Worker`` is an actual class
  374. and will work as expected when::
  375. class Worker(celery.Worker):
  376. ...
  377. - New signal: :signal:`task-success`.
  378. - Multiprocessing logs are now only emitted if the :envvar:`MP_LOG`
  379. environment variable is set.
  380. - The Celery instance can now be created with a broker URL
  381. .. code-block:: python
  382. celery = Celery(broker='redis://')
  383. - Result backends can now be set using an URL
  384. Currently only supported by redis. Example use::
  385. CELERY_RESULT_BACKEND = 'redis://localhost/1'
  386. - Heartbeat frequency now every 5s, and frequency sent with event
  387. The heartbeat frequency is now available in the worker event messages,
  388. so that clients can decide when to consider workers offline based on
  389. this value.
  390. - Module celery.actors has been removed, and will be part of cl instead.
  391. - Introduces new ``celery`` command, which is an entrypoint for all other
  392. commands.
  393. The main for this command can be run by calling ``celery.start()``.
  394. - Annotations now supports decorators if the key startswith '@'.
  395. E.g.:
  396. .. code-block:: python
  397. def debug_args(fun):
  398. @wraps(fun)
  399. def _inner(*args, **kwargs):
  400. print('ARGS: %r' % (args, ))
  401. return _inner
  402. CELERY_ANNOTATIONS = {
  403. 'tasks.add': {'@__call__': debug_args},
  404. }
  405. Also tasks are now always bound by class so that
  406. annotated methods end up being bound.
  407. - Bugreport now available as a command and broadcast command
  408. - Get it from a Python repl::
  409. >>> import celery
  410. >>> print(celery.bugreport())
  411. - Using the ``celery`` command-line program::
  412. $ celery report
  413. - Get it from remote workers::
  414. $ celery inspect report
  415. - Module ``celery.log`` moved to :mod:`celery.app.log`.
  416. - Module ``celery.task.control`` moved to :mod:`celery.app.control`.
  417. - New signal: :signal:`task-revoked`
  418. Sent in the main process when the task is revoked or terminated.
  419. - ``AsyncResult.task_id`` renamed to ``AsyncResult.id``
  420. - ``TasksetResult.taskset_id`` renamed to ``.id``
  421. - ``xmap(task, sequence)`` and ``xstarmap(task, sequence)``
  422. Returns a list of the results applying the task function to every item
  423. in the sequence.
  424. Example::
  425. >>> from celery import xstarmap
  426. >>> xstarmap(add, zip(range(10), range(10)).apply_async()
  427. [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  428. - ``chunks(task, sequence, chunksize)``
  429. - ``group.skew(start=, stop=, step=)``
  430. Skew will skew the countdown for the individual tasks in a group,
  431. e.g. with a group::
  432. >>> g = group(add.s(i, i) for i in xrange(10))
  433. Skewing the tasks from 0 seconds to 10 seconds::
  434. >>> g.skew(stop=10)
  435. Will have the first task execute in 0 seconds, the second in 1 second,
  436. the third in 2 seconds and so on.
  437. - 99% test Coverage
  438. - :setting:`CELERY_QUEUES` can now be a list/tuple of :class:`~kombu.Queue`
  439. instances.
  440. Internally :attr:`@amqp.queues` is now a mapping of name/Queue instances,
  441. instead of converting on the fly.
  442. * Can now specify connection for :class:`@control.inspect`.
  443. .. code-block:: python
  444. from kombu import Connection
  445. i = celery.control.inspect(connection=Connection('redis://'))
  446. i.active_queues()
  447. * Module :mod:`celery.app.task` is now a module instead of a package.
  448. The setup.py install script will try to remove the old package,
  449. if that doesn't work for some reason you have to remove
  450. it manually, you can do so by executing the command::
  451. $ rm -r $(dirname $(python -c '
  452. import celery;print(celery.__file__)'))/app/task/
  453. * :setting:`CELERY_FORCE_EXECV` is now enabled by default.
  454. If the old behavior is wanted the setting can be set to False,
  455. or the new :option:`--no-execv` to :program:`celery worker`.
  456. * Deprecated module ``celery.conf`` has been removed.
  457. * The :setting:`CELERY_TIMEZONE` now always require the :mod:`pytz`
  458. library to be installed (exept if the timezone is set to `UTC`).
  459. * The Tokyo Tyrant backend has been removed and is no longer supported.
  460. * Now uses :func:`~kombu.common.maybe_declare` to cache queue declarations.
  461. * There is no longer a global default for the
  462. :setting:`CELERYBEAT_MAX_LOOP_INTERVAL` setting, it is instead
  463. set by individual schedulers.
  464. * Worker: now truncates very long message bodies in error reports.
  465. * No longer deepcopies exceptions when trying to serialize errors.
  466. * :envvar:`CELERY_BENCH` environment variable, will now also list
  467. memory usage statistics at worker shutdown.
  468. * Worker: now only ever use a single timer for all timing needs,
  469. and instead set different priorities.
  470. * An exceptions arguments are now safely pickled
  471. Contributed by Matt Long.
  472. * Worker/Celerybeat no longer logs the startup banner.
  473. Previously it would be logged with severity warning,
  474. no it's only written to stdout.
  475. * The ``contrib/`` directory in the distribution has been renamed to
  476. ``extra/``.
  477. * New signal: :signal:`task_revoked`
  478. * celery.contrib.migrate: Many improvements including
  479. filtering, queue migration, and support for acking messages on the broker
  480. migrating from.
  481. Contributed by John Watson.
  482. * Worker: Prefetch count increments are now optimized and grouped together.
  483. * Worker: No longer calls ``consume`` on the remote control command queue
  484. twice.
  485. Probably didn't cause any problems, but was unecessary.
  486. Internals
  487. ---------
  488. * ``app.broker_connection`` is now ``app.connection``
  489. Both names still work.
  490. * Compat modules are now generated dynamically upon use.
  491. These modules are ``celery.messaging``, ``celery.log``,
  492. ``celery.decorators`` and ``celery.registry``.
  493. * :mod:`celery.utils` refactored into multiple modules:
  494. :mod:`celery.utils.text`
  495. :mod:`celery.utils.imports`
  496. :mod:`celery.utils.functional`
  497. * Now using :mod:`kombu.utils.encoding` instead of
  498. `:mod:`celery.utils.encoding`.
  499. * Renamed module ``celery.routes`` -> :mod:`celery.app.routes`.
  500. * Renamed package ``celery.db`` -> :mod:`celery.backends.database`.
  501. * Renamed module ``celery.abstract`` -> :mod:`celery.worker.bootsteps`.
  502. * Command-line docs are now parsed from the module docstrings.
  503. * Test suite directory has been reorganized.
  504. * :program:`setup.py` now reads docs from the :file:`requirements/` directory.
  505. * Celery commands no longer wraps output (Issue #700).
  506. Contributed by Thomas Johansson.
  507. .. _v260-experimental:
  508. Experimental
  509. ============
  510. :mod:`celery.contrib.methods`: Task decorator for methods
  511. ----------------------------------------------------------
  512. This is an experimental module containing a task
  513. decorator, and a task decorator filter, that can be used
  514. to create tasks out of methods::
  515. from celery.contrib.methods import task_method
  516. class Counter(object):
  517. def __init__(self):
  518. self.value = 1
  519. @celery.task(name='Counter.increment', filter=task_method)
  520. def increment(self, n=1):
  521. self.value += 1
  522. return self.value
  523. See :mod:`celery.contrib.methods` for more information.
  524. .. _v260-unscheduled-removals:
  525. Unscheduled Removals
  526. ====================
  527. Usually we don't make backward incompatible removals,
  528. but these removals should have no major effect.
  529. - The following settings have been renamed:
  530. - ``CELERYD_ETA_SCHEDULER`` -> ``CELERYD_TIMER``
  531. - ``CELERYD_ETA_SCHEDULER_PRECISION`` -> ``CELERYD_TIMER_PRECISION``
  532. .. _v260-deprecations:
  533. Deprecations
  534. ============
  535. See the :ref:`deprecation-timeline`.
  536. - The ``celery.backends.pyredis`` compat module has been removed.
  537. Use :mod:`celery.backends.redis` instead!
  538. - The following undocumented API's has been moved:
  539. - ``control.inspect.add_consumer`` -> :meth:`@control.add_consumer`.
  540. - ``control.inspect.cancel_consumer`` -> :meth:`@control.cancel_consumer`.
  541. - ``control.inspect.enable_events`` -> :meth:`@control.enable_events`.
  542. - ``control.inspect.disable_events`` -> :meth:`@control.disable_events`.
  543. This way ``inspect()`` is only used for commands that do not
  544. modify anything, while idempotent control commands that make changes
  545. are on the control objects.
  546. Fixes
  547. =====
  548. - Retry sqlalchemy backend operations on DatabaseError/OperationalError
  549. (Issue #634)
  550. - Tasks that called ``retry`` was not acknowledged if acks late was enabled
  551. Fix contributed by David Markey.
  552. - The message priority argument was not properly propagated to Kombu
  553. (Issue #708).
  554. Fix contributed by Eran Rundstein