Kaynağa Gözat

Merge branch 'master' of https://github.com/ask/celery

Leo Dirac 13 yıl önce
ebeveyn
işleme
ebc73dc7d4
52 değiştirilmiş dosya ile 93 ekleme ve 1144 silme
  1. 1 1
      AUTHORS
  2. 15 5
      Changelog
  3. 2 2
      README.rst
  4. 1 1
      celery/__init__.py
  5. 8 2
      celery/backends/base.py
  6. 1 0
      celery/beat.py
  7. 11 3
      celery/datastructures.py
  8. 3 3
      celery/task/control.py
  9. 2 2
      celery/tests/test_app/test_loaders.py
  10. 2 2
      celery/tests/test_backends/test_amqp.py
  11. 7 7
      celery/tests/test_events/test_events_state.py
  12. 1 1
      celery/tests/test_slow/test_buckets.py
  13. 2 2
      celery/tests/test_utils/test_utils_info.py
  14. 1 2
      celery/tests/test_worker/test_worker.py
  15. 2 2
      celery/tests/test_worker/test_worker_control.py
  16. 1 213
      celery/utils/compat.py
  17. 1 0
      celery/utils/timer2.py
  18. 1 1
      docs/.templates/page.html
  19. 1 1
      docs/.templates/sidebarintro.html
  20. 1 1
      docs/.templates/sidebarlogo.html
  21. 10 0
      docs/cookbook/daemonizing.rst
  22. BIN
      docs/homepage/bg.png
  23. BIN
      docs/homepage/bg000000.png
  24. BIN
      docs/homepage/bg_conte.png
  25. BIN
      docs/homepage/bg_grass.png
  26. BIN
      docs/homepage/bg_top00.png
  27. BIN
      docs/homepage/black_10.png
  28. 0 236
      docs/homepage/celery_1.0_released.html
  29. 0 316
      docs/homepage/community.html
  30. BIN
      docs/homepage/documentation.png
  31. 0 4
      docs/homepage/examplerun.txt
  32. 0 6
      docs/homepage/exampletask.txt
  33. BIN
      docs/homepage/favicon.png
  34. BIN
      docs/homepage/favicon0.png
  35. BIN
      docs/homepage/favicon_128.png
  36. BIN
      docs/homepage/favicon_32.png
  37. BIN
      docs/homepage/favicon_64.png
  38. 0 39
      docs/homepage/index.html
  39. BIN
      docs/homepage/logo0000.png
  40. 0 209
      docs/homepage/main0000.css
  41. 0 9
      docs/homepage/point0.html
  42. 0 69
      docs/homepage/trac0000.css
  43. BIN
      docs/homepage/white_50.png
  44. BIN
      docs/images/celery_128.png
  45. BIN
      docs/images/celery_512.png
  46. 1 1
      docs/includes/introduction.txt
  47. 1 1
      docs/templates/readme.txt
  48. 1 0
      requirements/py25.txt
  49. 1 0
      requirements/py26.txt
  50. 1 0
      requirements/test.txt
  51. 5 0
      requirements/test_py3k.txt
  52. 9 3
      setup.py

+ 1 - 1
AUTHORS

@@ -77,4 +77,4 @@ Ordered by date of first contribution:
   Mauro Rocco <fireantology@gmail.com>
   Matthew J Morrison <mattj.morrison@gmail.com>
   Daniel Watkins <daniel@daniel-watkins.co.uk>
-  rnoel <rnoel@ltutech.com>
+  Remy Noel <mocramis@gmail.com>

+ 15 - 5
Changelog

@@ -9,10 +9,7 @@
 
 2.3.0
 =====
-:release-date: TBA
-:status: frozen
-:branch: master
-
+:release-date: 2011-08-05 12:00 P.M BST
 :tested: cPython: 2.5, 2.6, 2.7; PyPy: 1.5; Jython: 2.5.2
 
 .. _v230-important:
@@ -20,6 +17,8 @@
 Important Notes
 ---------------
 
+* Now requires Kombu 1.2.1
+
 * Results are now disabled by default.
 
     The AMQP backend was not a good default because often the users were
@@ -40,6 +39,12 @@ Important Notes
 
     For help choosing a backend please see :ref:`task-result-backends`.
 
+* The debian init scripts have been deprecated in favor of the generic-init.d
+  init scripts.
+
+    In addition generic init scripts for celerybeat and celeryev has been
+    added.
+
 .. _v230-news:
 
 News
@@ -216,6 +221,11 @@ Fixes
 * ``CELERY_TASK_ERROR_WHITE_LIST`` is now properly initialized
   in all loaders.
 
+* celeryd_detach now passes thorugh commandline configuration.
+
+* Remote control command ``add_consumer`` now does nothing if the
+  queue is already being consumed from.
+
 
 .. _version-2.2.7:
 
@@ -344,7 +354,7 @@ News
     * ``eventlet_pool_postshutdown``
     * ``eventlet_pool_apply``
 
-    See :ref:`signals` for more information.
+    See :mod:`celery.signals` for more information.
 
 * New :setting:`BROKER_TRANSPORT_OPTIONS` setting can be used to pass
   additional arguments to a particular broker transport.

+ 2 - 2
README.rst

@@ -2,9 +2,9 @@
  celery - Distributed Task Queue
 =================================
 
-.. image:: http://cloud.github.com/downloads/ask/celery/celery_favicon_128.png
+.. image:: http://cloud.github.com/downloads/ask/celery/celery_128.png
 
-:Version: 2.3.0rc2
+:Version: 2.3.0
 :Web: http://celeryproject.org/
 :Download: http://pypi.python.org/pypi/celery/
 :Source: http://github.com/ask/celery/

+ 1 - 1
celery/__init__.py

@@ -5,7 +5,7 @@
 import os
 import sys
 
-VERSION = (2, 3, 0, "rc2")
+VERSION = (2, 3, 0)
 
 __version__ = ".".join(map(str, VERSION[0:3])) + "".join(VERSION[3:])
 __author__ = "Ask Solem"

+ 8 - 2
celery/backends/base.py

@@ -219,7 +219,10 @@ class BaseDictBackend(BaseBackend):
 
     def get_task_meta(self, task_id, cache=True):
         if cache and task_id in self._cache:
-            return self._cache[task_id]
+            try:
+                return self._cache[task_id]
+            except KeyError:
+                pass   # backend emptied in the meantime
 
         meta = self._get_task_meta_for(task_id)
         if cache and meta.get("status") == states.SUCCESS:
@@ -235,7 +238,10 @@ class BaseDictBackend(BaseBackend):
 
     def get_taskset_meta(self, taskset_id, cache=True):
         if cache and taskset_id in self._cache:
-            return self._cache[taskset_id]
+            try:
+                return self._cache[taskset_id]
+            except KeyError:
+                pass  # backend emptied in the meantime
 
         meta = self._restore_taskset(taskset_id)
         if cache and meta is not None:

+ 1 - 0
celery/beat.py

@@ -87,6 +87,7 @@ class ScheduleEntry(object):
         return self.__class__(**dict(self,
                                      last_run_at=last_run_at or datetime.now(),
                                      total_run_count=self.total_run_count + 1))
+    __next__ = next  # for 2to3
 
     def update(self, other):
         """Update values from another entry.

+ 11 - 3
celery/datastructures.py

@@ -9,12 +9,14 @@ Custom data structures.
 
 """
 from __future__ import absolute_import
+from __future__ import with_statement
 
 import time
 import traceback
 
 from itertools import chain
 from Queue import Empty
+from threading import RLock
 
 from celery.utils.compat import OrderedDict
 
@@ -299,11 +301,17 @@ class LocalCache(OrderedDict):
     def __init__(self, limit=None):
         super(LocalCache, self).__init__()
         self.limit = limit
+        self.lock = RLock()
 
     def __setitem__(self, key, value):
-        while len(self) >= self.limit:
-            self.popitem(last=False)
-        super(LocalCache, self).__setitem__(key, value)
+        with self.lock:
+            while len(self) >= self.limit:
+                self.popitem(last=False)
+            super(LocalCache, self).__setitem__(key, value)
+
+    def pop(self, key, *args):
+        with self.lock:
+            super(LocalCache, self).pop(key, *args)
 
 
 class TokenBucket(object):

+ 3 - 3
celery/task/control.py

@@ -209,9 +209,9 @@ class Control(object):
         """
         with self.app.default_connection(connection, connect_timeout) as conn:
             if channel is None:
-                if not getattr(conn, "_publisher_chan", None):
-                    conn._publisher_chan = conn.channel()
-                channel = conn._publisher_chan
+                if not getattr(conn, "_producer_chan", None):
+                    conn._producer_chan = conn.channel()
+                channel = conn._producer_chan
             return self.mailbox(conn)._broadcast(command, arguments,
                                                  destination, reply, timeout,
                                                  limit, callback,

+ 2 - 2
celery/tests/test_app/test_loaders.py

@@ -103,8 +103,8 @@ class TestLoaderBase(unittest.TestCase):
         self.assertEqual(self.loader.conf["foo"], "bar")
 
     def test_import_default_modules(self):
-        self.assertItemsEqual(self.loader.import_default_modules(),
-                              [os, sys, task])
+        self.assertEqual(sorted(self.loader.import_default_modules()),
+                         sorted([os, sys, task]))
 
     def test_import_from_cwd_custom_imp(self):
 

+ 2 - 2
celery/tests/test_backends/test_amqp.py

@@ -225,10 +225,10 @@ class test_AMQPBackend(unittest.TestCase):
                                     "traceback": None,
                                     "task_id": uuid})
                                 for i, uuid in enumerate(uuids)]
-        self.assertItemsEqual(res, expected_results)
+        self.assertEqual(sorted(res), sorted(expected_results))
         self.assertDictEqual(b._cache[res[0][0]], res[0][1])
         cached_res = list(b.get_many(uuids, timeout=1))
-        self.assertItemsEqual(cached_res, expected_results)
+        self.assertEqual(sorted(cached_res), sorted(expected_results))
         b._cache[res[0][0]]["status"] = states.RETRY
         self.assertRaises(socket.timeout, list,
                           b.get_many(uuids, timeout=0.01))

+ 7 - 7
celery/tests/test_events/test_events_state.py

@@ -105,14 +105,14 @@ class test_Task(unittest.TestCase):
                     received=time() - 10,
                     started=time() - 8,
                     succeeded=time())
-        self.assertItemsEqual(list(task._info_fields),
-                              task.info().keys())
+        self.assertEqual(sorted(list(task._info_fields)),
+                              sorted(task.info().keys()))
 
-        self.assertItemsEqual(list(task._info_fields + ("received", )),
-                              task.info(extra=("received", )))
+        self.assertEqual(sorted(list(task._info_fields + ("received", ))),
+                              sorted(task.info(extra=("received", ))))
 
-        self.assertItemsEqual(["args", "kwargs"],
-                              task.info(["args", "kwargs"]).keys())
+        self.assertEqual(sorted(["args", "kwargs"]),
+                         sorted(task.info(["args", "kwargs"]).keys()))
 
     def test_ready(self):
         task = Task(uuid="abcdefg",
@@ -278,7 +278,7 @@ class test_State(unittest.TestCase):
     def test_task_types(self):
         r = ev_snapshot(State())
         r.play()
-        self.assertItemsEqual(r.state.task_types(), ["task1", "task2"])
+        self.assertEqual(sorted(r.state.task_types()), ["task1", "task2"])
 
     def test_tasks_by_timestamp(self):
         r = ev_snapshot(State())

+ 1 - 1
celery/tests/test_slow/test_buckets.py

@@ -278,7 +278,7 @@ class test_TaskBucket(unittest.TestCase):
         x.buckets[TaskA.name].put(1)
         x.buckets[TaskB.name].put(2)
         x.buckets[TaskC.name].put(3)
-        self.assertItemsEqual(x.items, [1, 2, 3])
+        self.assertEqual(sorted(x.items), [1, 2, 3])
 
 
 class test_FastQueue(unittest.TestCase):

+ 2 - 2
celery/tests/test_utils/test_utils_info.py

@@ -39,5 +39,5 @@ class TestInfo(unittest.TestCase):
     def test_format_queues(self):
         celery = Celery(set_as_current=False)
         celery.amqp.queues = celery.amqp.Queues(QUEUES)
-        self.assertItemsEqual(celery.amqp.queues.format().split("\n"),
-                              [QUEUE_FORMAT1, QUEUE_FORMAT2])
+        self.assertEqual(sorted(celery.amqp.queues.format().split("\n")),
+                         sorted([QUEUE_FORMAT1, QUEUE_FORMAT2]))

+ 1 - 2
celery/tests/test_worker/test_worker.py

@@ -27,7 +27,7 @@ from celery.utils.timer2 import Timer
 
 from celery.tests.compat import catch_warnings
 from celery.tests.utils import unittest
-from celery.tests.utils import AppCase, skip
+from celery.tests.utils import AppCase
 
 
 class PlaceHolder(object):
@@ -854,7 +854,6 @@ class test_WorkController(AppCase):
         finally:
             state.Persistent = Persistent
 
-    @skip("Issue #264")
     def test_disable_rate_limits(self):
         from celery.worker.buckets import FastQueue
         worker = self.create_worker(disable_rate_limits=True)

+ 2 - 2
celery/tests/test_worker/test_worker_control.py

@@ -216,8 +216,8 @@ class test_ControlPanel(unittest.TestCase):
         state.revoked.add("a2")
 
         try:
-            self.assertItemsEqual(self.panel.handle("dump_revoked"),
-                                  ["a1", "a2"])
+            self.assertEqual(sorted(self.panel.handle("dump_revoked")),
+                             ["a1", "a2"])
         finally:
             state.revoked.clear()
 

+ 1 - 213
celery/utils/compat.py

@@ -18,222 +18,10 @@ except ImportError:
         from io import StringIO         # noqa
 
 ############## collections.OrderedDict ######################################
-
-import weakref
-try:
-    from collections import MutableMapping
-except ImportError:
-    from UserDict import DictMixin as MutableMapping  # noqa
-from itertools import imap as _imap
-from operator import eq as _eq
-
-
-class _Link(object):
-    """Doubly linked list."""
-    # next can't be lowercase because 2to3 thinks it's a generator
-    # and renames it to __next__.
-    __slots__ = 'PREV', 'NEXT', 'key', '__weakref__'
-
-
-class CompatOrderedDict(dict, MutableMapping):
-    """Dictionary that remembers insertion order"""
-    # An inherited dict maps keys to values.
-    # The inherited dict provides __getitem__, __len__, __contains__, and get.
-    # The remaining methods are order-aware.
-    # Big-O running times for all methods are the same as for regular
-    # dictionaries.
-
-    # The internal self.__map dictionary maps keys to links in a doubly
-    # linked list.
-    # The circular doubly linked list starts and ends with a sentinel element.
-    # The sentinel element never gets deleted (this simplifies the algorithm).
-    # The prev/next links are weakref proxies (to prevent circular
-    # references).
-    # Individual links are kept alive by the hard reference in self.__map.
-    # Those hard references disappear when a key is deleted from
-    # an OrderedDict.
-
-    __marker = object()
-
-    def __init__(self, *args, **kwds):
-        """Initialize an ordered dictionary.
-
-        Signature is the same as for regular dictionaries, but keyword
-        arguments are not recommended because their insertion order is
-        arbitrary.
-
-        """
-        if len(args) > 1:
-            raise TypeError("expected at most 1 arguments, got %d" % (
-                                len(args)))
-        try:
-            self._root
-        except AttributeError:
-            # sentinel node for the doubly linked list
-            self._root = root = _Link()
-            root.PREV = root.NEXT = root
-            self.__map = {}
-        self.update(*args, **kwds)
-
-    def clear(self):
-        "od.clear() -> None.  Remove all items from od."
-        root = self._root
-        root.PREV = root.NEXT = root
-        self.__map.clear()
-        dict.clear(self)
-
-    def __setitem__(self, key, value):
-        "od.__setitem__(i, y) <==> od[i]=y"
-        # Setting a new item creates a new link which goes at the end of the
-        # linked list, and the inherited dictionary is updated with the new
-        # key/value pair.
-        if key not in self:
-            self.__map[key] = link = _Link()
-            root = self._root
-            last = root.PREV
-            link.PREV, link.NEXT, link.key = last, root, key
-            last.NEXT = root.PREV = weakref.proxy(link)
-        dict.__setitem__(self, key, value)
-
-    def __delitem__(self, key):
-        """od.__delitem__(y) <==> del od[y]"""
-        # Deleting an existing item uses self.__map to find the
-        # link which is then removed by updating the links in the
-        # predecessor and successor nodes.
-        dict.__delitem__(self, key)
-        link = self.__map.pop(key)
-        link.PREV.NEXT = link.NEXT
-        link.NEXT.PREV = link.PREV
-
-    def __iter__(self):
-        """od.__iter__() <==> iter(od)"""
-        # Traverse the linked list in order.
-        root = self._root
-        curr = root.NEXT
-        while curr is not root:
-            yield curr.key
-            curr = curr.NEXT
-
-    def __reversed__(self):
-        """od.__reversed__() <==> reversed(od)"""
-        # Traverse the linked list in reverse order.
-        root = self._root
-        curr = root.PREV
-        while curr is not root:
-            yield curr.key
-            curr = curr.PREV
-
-    def __reduce__(self):
-        """Return state information for pickling"""
-        items = [[k, self[k]] for k in self]
-        tmp = self.__map, self._root
-        del(self.__map, self._root)
-        inst_dict = vars(self).copy()
-        self.__map, self._root = tmp
-        if inst_dict:
-            return (self.__class__, (items,), inst_dict)
-        return self.__class__, (items,)
-
-    def setdefault(self, key, default=None):
-        try:
-            return self[key]
-        except KeyError:
-            self[key] = default
-        return default
-
-    def update(self, other=(), **kwds):
-        if isinstance(other, dict):
-            for key in other:
-                self[key] = other[key]
-        elif hasattr(other, "keys"):
-            for key in other.keys():
-                self[key] = other[key]
-        else:
-            for key, value in other:
-                self[key] = value
-        for key, value in kwds.items():
-            self[key] = value
-
-    def pop(self, key, default=__marker):
-        try:
-            value = self[key]
-        except KeyError:
-            if default is self.__marker:
-                raise
-            return default
-        else:
-            del self[key]
-            return value
-
-    def values(self):
-        return [self[key] for key in self]
-
-    def items(self):
-        return [(key, self[key]) for key in self]
-
-    def itervalues(self):
-        for key in self:
-            yield self[key]
-
-    def iteritems(self):
-        for key in self:
-            yield (key, self[key])
-
-    def iterkeys(self):
-        return iter(self)
-
-    def keys(self):
-        return list(self)
-
-    def popitem(self, last=True):
-        """od.popitem() -> (k, v)
-
-        Return and remove a (key, value) pair.
-        Pairs are returned in LIFO order if last is true or FIFO
-        order if false.
-
-        """
-        if not self:
-            raise KeyError('dictionary is empty')
-        key = (last and reversed(self) or iter(self)).next()
-        value = self.pop(key)
-        return key, value
-
-    def __repr__(self):
-        "od.__repr__() <==> repr(od)"
-        if not self:
-            return '%s()' % (self.__class__.__name__,)
-        return '%s(%r)' % (self.__class__.__name__, self.items())
-
-    def copy(self):
-        "od.copy() -> a shallow copy of od"
-        return self.__class__(self)
-
-    @classmethod
-    def fromkeys(cls, iterable, value=None):
-        """OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
-        and values equal to v (which defaults to None)."""
-        d = cls()
-        for key in iterable:
-            d[key] = value
-        return d
-
-    def __eq__(self, other):
-        """od.__eq__(y) <==> od==y.  Comparison to another OD is
-        order-sensitive while comparison to a regular mapping
-        is order-insensitive."""
-        if isinstance(other, OrderedDict):
-            return len(self) == len(other) and \
-                   all(_imap(_eq, self.iteritems(), other.iteritems()))
-        return dict.__eq__(self, other)
-
-    def __ne__(self, other):
-        return not (self == other)
-
 try:
     from collections import OrderedDict
 except ImportError:
-    OrderedDict = CompatOrderedDict  # noqa
+    from ordereddict import OrderedDict  # noqa
 
 ############## logging.LoggerAdapter ########################################
 import logging

+ 1 - 0
celery/utils/timer2.py

@@ -173,6 +173,7 @@ class Timer(Thread):
                     self.not_empty.wait(1.0)
                 return delay
         return self.apply_entry(entry)
+    __next__ = next  # for 2to3
 
     def run(self):
         try:

+ 1 - 1
docs/.templates/page.html

@@ -2,7 +2,7 @@
 {% block body %}
 <div class="deck">
 
-    {% if version == "2.3" or version == "3.0" %}
+    {% if version == "2.4" or version == "3.0" %}
         <p class="developmentversion">
         This document is for Celery's development version, which can be
         significantly different from previous releases. Get old docs here:

+ 1 - 1
docs/.templates/sidebarintro.html

@@ -1,4 +1,4 @@
 <p class="logo"><a href="{{ pathto(master_doc) }}">
-  <img class="logo" src="http://cloud.github.com/downloads/ask/celery/celery_favicon_128.png" alt="Logo"/>
+  <img class="logo" src="http://cloud.github.com/downloads/ask/celery/celery_128.png" alt="Logo"/>
 </a></p>
 

+ 1 - 1
docs/.templates/sidebarlogo.html

@@ -1,3 +1,3 @@
 <p class="logo"><a href="{{ pathto(master_doc) }}">
-  <img class="logo" src="http://cloud.github.com/downloads/ask/celery/celery_favicon_128.png" alt="Logo"/>
+  <img class="logo" src="http://cloud.github.com/downloads/ask/celery/celery_128.png" alt="Logo"/>
 </a></p>

+ 10 - 0
docs/cookbook/daemonizing.rst

@@ -262,3 +262,13 @@ launchd (OS X)
 
 .. _`contrib/mac/`:
     http://github.com/ask/celery/tree/master/contrib/mac/
+
+
+.. _daemon-windows:
+
+Windows
+=======
+
+See this excellent external tutorial:
+
+http://www.calazan.com/windows-tip-run-applications-in-the-background-using-task-scheduler/

BIN
docs/homepage/bg.png


BIN
docs/homepage/bg000000.png


BIN
docs/homepage/bg_conte.png


BIN
docs/homepage/bg_grass.png


BIN
docs/homepage/bg_top00.png


BIN
docs/homepage/black_10.png


+ 0 - 236
docs/homepage/celery_1.0_released.html

@@ -1,236 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<meta name="keywords" content="task queue, job queue, asynchronous, rabbitmq, amqp,
-redis, django, python, webhooks, queue, distributed">
-<meta name="description" content="open source distributed task queue" >
-<link rel="icon" type="image/png" href="favicon.png">
-<meta name="viewport" content="width=320, user-scalable=no">
-<link rel="apple-touch-icon" href="favicon_64.png"/>
-<title>Celery - The Distributed Task Queue</title>
-<link rel="stylesheet" href="main.css"/>
-<link rel="stylesheet" href="trac.css"/>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try {
-var pageTracker = _gat._getTracker("UA-12986238-1");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-
-</head>
-
-<body>
-<div id="navbar">
-  <div class="iStretch">
-    <div class="link" id="current"><a href="/">Home</a></div>
-    <div class="link"><a href="http://github.com/ask/celery">Code</a></div>
-    <div class="link"><a href="docs/">Documentation</a></div>
-    <div class="link"><a href="http://ask.github.com/celery/getting-started/">Tutorials</a></div>
-    <div class="link"><a href="http://pypi.python.org/pypi/celery">Download</a></div>
-  </div>
-</div>
-
-<div class="iStretch">
-
-  <div id="topcontainer">
-  <ul>
-    <li>Background Processing
-    <li>Distributed
-    <li>Asynchronous/Synchronous
-    <li>Concurrency
-    <li>Periodic Tasks
-    <li>Retries
-  </ul>
-  </div>
-
-  <div id="contentcontainer">
-
-    <div class="column">
-<h1>Celery 1.0 has been released!</a></h1>
-<p>We&#8217;re happy to announce the release of Celery 1.0.</p>
-<div class="section" id="what-is-it">
-<h2>What is it?</h2>
-<p>Celery is a task queue/job queue based on distributed message passing.
-It is focused on real-time operation, but supports scheduling as well.</p>
-<p>The execution units, called tasks, are executed concurrently on one or
-more worker servers. Tasks can execute asynchronously (in the background) or synchronously
-(wait until ready).</p>
-<p>Celery is already used in production to process millions of tasks a day.</p>
-<p>Celery was originally created for use with Django, but is now usable
-from any Python project. It can
-also operate with other languages via webhooks.</p>
-<p>The recommended message broker is <a class="reference external" href="http://rabbitmq.org">RabbitMQ</a>, but support for Redis or
-database is also available.</p>
-<div class="section" id="features">
-<h3>Features</h3>
-<p>See <a class="reference external" href="http://ask.github.com/celery/getting-started/introduction.html#features">http://ask.github.com/celery/getting-started/introduction.html#features</a></p>
-</div>
-</div>
-<div class="section" id="stable-api">
-<h2>Stable API</a></h2>
-<p>From this version on the public API is considered stable. This means there won&#8217;t
-be any backwards incompatible changes in new minor versions. Changes to the
-API will be deprecated; so, for example, if we decided to remove a function
-that existed in Celery 1.0:</p>
-<ul class="simple">
-<li>Celery 1.2 will contain a backwards-compatible replica of the function which
-will raise a <tt class="docutils literal"><span class="pre">PendingDeprecationWarning</span></tt>.
-This warning is silent by default; you need to explicitly turn on display
-of these warnings.</li>
-<li>Celery 1.4 will contain the backwards-compatible replica, but the warning
-will be promoted to a full-fledged <tt class="docutils literal"><span class="pre">DeprecationWarning</span></tt>. This warning
-is loud by default, and will likely be quite annoying.</li>
-<li>Celery 1.6 will remove the feature outright.</li>
-</ul>
-<p>See the <a class="reference external" href="http://ask.github.com/celery/internals/deprecation.html">Celery Deprecation Timeline</a> for a list of pending removals.</p>
-</div>
-<div class="section" id="what-s-new">
-<h2>What&#8217;s new?</h2>
-<ul>
-<li><p class="first">Task decorators</p>
-<p>Write tasks as regular functions and decorate them.
-There are both <tt class="xref docutils literal"><span class="pre">task()</span></tt>, and <tt class="xref docutils literal"><span class="pre">periodic_task()</span></tt> decorators.</p>
-</li>
-<li><p class="first">Tasks are automatically registered</p>
-<p>Registering the tasks manually was getting tedious, so now you don&#8217;t have
-to anymore. You can still do it manually if you need to, just
-disable <tt class="xref docutils literal"><span class="pre">Task.autoregister</span></tt>. The concept of abstract task classes
-has also been introduced, this is like django models, where only the
-subclasses of an abstract task is registered.</p>
-</li>
-<li><p class="first">Events</p>
-<p>If enabled, the worker will send events, telling you what tasks it
-executes, their results, and how long it took to execute them. It also
-sends out heartbeats, so listeners are able to detect nonfunctional
-workers. This is the basis for the new real-time web monitor we&#8217;re working on
-(<a class="reference external" href="http://github.com/ask/celerymon/">celerymon</a>)</p>
-</li>
-</ul>
-<ul>
-<li><p class="first">Rate limiting</p>
-<p>Global and per task rate limits. 10 tasks a second? or one an hour? You
-decide. It&#8217;s using the awesome <a class="reference external" href="http://en.wikipedia.org/wiki/Token_bucket">token bucket algorithm</a>, which is
-commonly used for network traffic shaping. It accounts for bursts of
-activity, so your workers won&#8217;t be bored by having nothing to do.</p>
-</li>
-</ul>
-<ul>
-<li><p class="first">New periodic task service.</p>
-<p>Periodic tasks are no longer dispatched by <tt class="docutils literal"><span class="pre">celeryd</span></tt>, but instead by a
-separate service called <tt class="docutils literal"><span class="pre">celerybeat</span></tt>. This is an optimized, centralized
-service dedicated to your periodic tasks, which means you don&#8217;t have to
-worry about deadlocks or race conditions any more. But that does mean you
-have to make sure only one instance of this service is running at any one
-time.</p>
-<p><strong>TIP:</strong> If you&#8217;re only running a single <tt class="docutils literal"><span class="pre">celeryd</span></tt> server, you can embed
-<tt class="docutils literal"><span class="pre">celerybeat</span></tt> inside it. Just add the <tt class="docutils literal"><span class="pre">--beat</span></tt> argument.</p>
-</li>
-<li><p class="first">Broadcast commands</p>
-<p>If you change your mind and don&#8217;t want to run a task after all, you
-now have the option to revoke it.</p>
-<p>Also, you can rate limit tasks or even shut down the worker remotely.</p>
-<p>It doesn&#8217;t have many commands yet, but we&#8217;re waiting for broadcast
-commands to reach its full potential, so please share your ideas
-if you have any.</p>
-</li>
-<li><p class="first">Multiple queues</p>
-<p>The worker is able to receive tasks on multiple queues at once.
-This opens up a lot of new possibilities when combined with the impressive
-routing support in AMQP.</p>
-</li>
-<li><p class="first">Platform agnostic message format.</p>
-<p>The message format has been standardized and is now using the ISO-8601 format
-for dates instead of Python <tt class="docutils literal"><span class="pre">datetime</span></tt> objects. This means you can write task
-consumers in other languages than Python (<tt class="docutils literal"><span class="pre">eceleryd</span></tt> anyone?)</p>
-</li>
-<li><p class="first">Timely</p>
-<p>Periodic tasks are now scheduled on the clock, i.e. <tt class="docutils literal"><span class="pre">timedelta(hours=1)</span></tt>
-means every hour at :00 minutes, not every hour from the server starts.
-To revert to the previous behavior you have the option to enable
-<tt class="xref docutils literal"><span class="pre">PeriodicTask.relative</span></tt>.</p>
-</li>
-<li><p class="first">... and a lot more!</p>
-</li>
-</ul>
-<p>To read about these and other changes in detail, please refer to
-the <a class="reference external" href="http://ask.github.com/celery/changelog.html">changelog</a>. This document contains crucial information for those
-upgrading from a previous version of Celery, so be sure to read the entire
-change set before you continue.</p>
-<p><strong>TIP:</strong> If you install the <tt class="xref docutils literal"><span class="pre">setproctitle</span></tt> module you can see which
-task each worker process is currently executing in <tt class="docutils literal"><span class="pre">ps</span></tt> listings.
-Just install it using pip: <tt class="docutils literal"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">setproctitle</span></tt>.</p>
-</div>
-<div class="section" id="resources">
-<h2>Resources</h2>
-<ul class="simple">
-<li><a class="reference external" href="http://docs.celeryproject.org/">Documentation</a></li>
-<li><a class="reference external" href="http://docs.celeryproject.org/changelog.html">Changelog</a></li>
-<li><a class="reference external" href="http://ask.github.com/celery/faq.html">FAQ</a></li>
-<li><a class="reference external" href="http://groups.google.com/group/celery-users">Mailing-list</a></li>
-<li><a class="reference external" href="http://twitter.com/asksol">Twitter</a></li>
-<li>IRC: #celery on irc.freenode.net.</li>
-</ul>
-</div>
-
-
-    <div class="hidden">
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        </p>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        </p>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        </p>
-    </div>
-    </div>
-
-    <div class="column">
-
-      <span class="newsitem">
-      <h2>Celery 1.0 released!</h2>
-      <h4>By <a href="http://twitter.com/asksol">@asksol</a> on 10.02.2010</h4>
-      <p>Celery 1.0 has finally been released! It is available on <a
-          href="http://pypi.python.org/pypi/celery/1.0.0">PyPI</a> for
-      downloading. You can also install it via <code>pip install
-          celery</code>. You can read the announcement <a href="celery_1.0_released.html">here</a>.
-      <hr>
-      </span>
-
-      <span class="newsitem">
-      <h2>1.0 is in beta.</h2>
-      <h4>By <a href="http://twitter.com/asksol">@asksol</a> on 08.02.2010</h4>
-      <p>1.0 is scheduled to be released this week! Please help us test the latest
-      <a href="http://github.com/ask/celery/tarball/v1.0.0-pre4">release
-          candiate</a> to make this happen. To upgrade from an earlier
-      version, please read the <a href="http://ask.github.com/celery/changelog.html">changelog</a>.
-      <hr>
-      </span>
-
-      <span class="newsitem">
-      <h2>New website.</h2>
-      <h4>By <a href="http://twitter.com/asksol">@asksol</a> on 08.02.2010</h4>
-      <p>We finally got a home page. Big thanks to <a href="http://helmersworks.com">Jan Henrik Helmers</a>
-      <hr>
-      </span>
-
-    </div>
-
-  </div>
-
- <div id="credits">
-     <div class="iStretch">Copyright (c) 2009-2011, <a href="http://twitter.com/asksol">Ask Solem</a> and
-         <a href="http://github.com/ask/celery/blob/master/AUTHORS">contributors</a>.<br>
- Page design by <a href="http://www.helmersworks.com/">Jan Henrik Helmers</a>
-   </div>
- </div>
-
-
-</div>
-</body>
-</html>

+ 0 - 316
docs/homepage/community.html

@@ -1,316 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-<meta charset="utf-8">
-<meta name="keywords" content="task queue, job queue, asynchronous, rabbitmq, amqp,
-redis, django, python, webhooks, queue, distributed">
-<meta name="description" content="open source distributed task queue" >
-<link rel="icon" type="image/png" href="favicon0.png">
-<meta name="viewport" content="width=500, user-scalable=no">
-<link rel="apple-touch-icon" href="favicon_64.png"/>
-<title>Celery - The Distributed Task Queue</title>
-<link rel="stylesheet" href="main0000.css"/>
-<link rel="stylesheet" href="trac0000.css"/>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try {
-var pageTracker = _gat._getTracker("UA-12986238-1");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-
-
-
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-
-</head>
-
-<body>
-<div id="navbar">
-  <div class="iStretch">
-    <div class="link"><a href="index.html">Home</a></div>
-    <div class="link"><a href="http://github.com/ask/celery">Code</a></div>
-    <div class="link"><a href="docs/">Documentation</a></div>
-    <div class="link" id="current"><a href="community.html">Community</a></div>
-    <div class="link"><a href="http://pypi.python.org/pypi/celery">Download</a></div>
-  </div>
-</div>
-
-<div class="iStretch">
-
-  <div id="topcontainer">
-  <ul>
-    <li>Background Processing
-    <li>Distributed
-    <li>Asynchronous/Synchronous
-    <li>Concurrency
-    <li>Periodic Tasks
-    <li>Retries
-  </ul>
-  </div>
-
-  <div id="contentcontainer">
-
-    <div class="column">
-        <h2>Community Links</h2>
-
-<p class="communitylink"><a href="http://query7.com/tutorial-celery-with-django
-">Using Celery With Django Tutorial (query7.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2011/04/03/celery-redis-and-django/
-">Celery, Redis and Django Tutorial (trespams.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2011/04/03/celery-i-redis/
-">Celery i Redis (trespams.com) (Catalan)</a></p>
-<p class="communitylink"><a href="http://tomwardill.posterous.com/using-fabric-from-celery-in-django
-">Using Fabric from Celery in Django (tomwardill.posterous.com)</a></p>
-<p class="communitylink"><a href="http://blip.tv/file/4878746
-">PyCon-2011: Distributed Tasks with Celery (Video) (pycon.blip.tv)</a></p>
-<p class="communitylink"><a href="http://www.slideshare.net/zeeg/pycon-2011-scaling-disqus-7251315
-">PyCon-2011: Scaling Disqus (slideshare.net)</a></p>
-<p class="communitylink"><a href="http://www.quora.com/How-stable-is-Celery
-">How stable is Celery? (quora.com)</a></p>
-<p class="communitylink"><a href="https://getpantheon.com/news/behind-scenes-pantheon-api
-">Behind The Scenes: Pantheon as an API (getpantheon.com)</a></p>
-<p class="communitylink"><a href="http://eflorenzano.com/blog/post/technology-behind-convore/
-">The Technology Behind Convore (eflorenzano.com)</a></p>
-<p class="communitylink"><a href="http://buntin.org/2011/02/27/django-celery-for-non-blocking-django-signals/
-">django-celery for non-blocking Django signals. (buntin.org)</a></p>
-<p class="communitylink"><a href="http://www.whiskeymedia.com/news/the-whiskey-technology-stack/4/
-">The Whiskey Technology Stack (whiskeymedia.com)</a></p>
-<p class="communitylink"><a href="http://www.toforge.com/2011/02/a-simple-python-sandbox-for-celery-and-not/
-">A simple python sandbox for Celery and not (toforge.com)</a></p>
-<p class="communitylink"><a href="http://www.ep.io/blog/celery-ssl-and-loadbalancers/
-">Celery, SSL, and Load Balancers (ep.io)</a></p>
-<p class="communitylink"><a href="http://docs.dotcloud.com/tutorials/celery/
-">Deploying a Celery worker on DotCloud (dotcloud.com)</a></p>
-<p class="communitylink"><a href="http://joshbohde.com/blog/async-workers-in-django-with-celery
-">Async Workers in Django with Celery (joshbohde.com)</a></p>
-<p class="communitylink"><a href="http://www.colinhowe.co.uk/2011/02/08/celery-and-sentry-recording-errors/
-">Celery and Sentry - Recording Errors (colinhowe.co.uk)</a></p>
-<p class="communitylink"><a href="http://blog.apsl.net/2011/01/14/introduccion-a-celery/
-">Introducción a Celery (Spanish) (apsl.net)</a></p>
-<p class="communitylink"><a href="http://haltu.fi/en/b/qml_wrapper_service_explained.html
-">QML wrapper service explained (haltu.fi)</a></p>
-<p class="communitylink"><a href="http://bmbouter.github.com/CeleryManagement/getting-started/introduction.html
-">CeleryManagement - monitor and manage Celery installations (github.com)</a></p>
-<p class="communitylink"><a href="http://mindby.org/2011/02/celery-and-twisted/
-">Celery and Twisted (mindby.org)</a></p>
-<p class="communitylink"><a href="http://sci-blog.com/2010/11/celery-configuration-for-redis-backend/
-">Celery configuration for Redis backend (sci-blog.com)</a></p>
-<p class="communitylink"><a href="http://www.toforge.com/2011/01/run-celery-tasks-from-php/
-">Run Celery tasks from PHP (toforge.com)</a></p>
-<p class="communitylink"><a href="http://seeknuance.com/2010/12/17/celery-uses-spin-loops-gah/
-">Celery uses spin-loops. Gah! (seeknuance.com)</a></p>
-<p class="communitylink"><a href="http://richard.volpato.net/2011/01/10/architecture-of-statistically-powered-web-sites/
-">Architecture of Data Powered Web Sites (richard.volpato.net)</a></p>
-<p class="communitylink"><a href="http://blog.gridcentriclabs.com/2011/01/how-fast-can-you-add-more-worker-nodes.html
-">How fast can you add more worker nodes? (gridcentriclabs.com)</a></p>
-<p class="communitylink"><a href="http://bitkickers.blogspot.com/2011/01/getting-arbitrary-log-files-into.html
-">Getting arbitrary log files into Rsyslog (bitkickers)</a></p>
-<p class="communitylink"><a href="http://www.howsthe.com/blog/2010/dec/13/making-celery-pymongo-play-nicely/
-">Making Celery and PyMongo play nicely together (howsthe.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2010/11/28/celery-mini-tutorial/
-">Celery: Mini Tutorial (Catalan) (trespams.com)</a></p>
-<p class="communitylink"><a href="http://ericholscher.com/blog/2010/nov/11/building-django-app-server-chef-part-4/
-">Building a Django App Server with Chef (ericholscher.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2010/11/13/introduccio-celery/
-">Introducció a Celery (Catalan) (trespams.com)</a></p>
-
-<p class="communitylink"><a href="http://tensixtyone.com/django-and-celery-death-to-cron
-">Django and Celery - Death to Cron (tensixtyone.com)</a></p>
-
-<p class="communitylink"><a href="http://ericholscher.com/blog/2010/nov/2/celery-tips/
-">Celery Tips (ericholscher.com)</a></p>
-
-<p class="communitylink"><a href="http://jacobian.org/writing/favorite-apps/
-">What's your favorite Django app? (jacobian.org)</a></p>
-
-<p class="communitylink"><a href="http://ericholscher.com/blog/2010/nov/1/virtualenv-tips/
-">Virtualenv Tips (ericholscher.com)</a></p>
-
-<p class="communitylink"><a href="http://iamseb.com/seb/2010/10/10-django-tools/
-">10 Tools That Make Django Better (iamseb.com)</a></p>
-
-<p class="communitylink"><a href="http://www.loose-bits.com/2010_10_10_archive.html
-">Distributed Task Locking in Celery (loose-bits.com)</a></p>
-
-<p class="communitylink"><a href="http://www.bitbybit.ru/article/216
-">Celery — распределенные очереди задач на Python (Russian) (bitbybit.ru)</a></p>
-
-<p class="communitylink"><a href="http://vorushin.ru/blog/34-celery-described/
-">Подробнее о Celery (Russian) (vorushin.ru)</a></p>
-
-<p class="communitylink"><a href="http://blog.timc3.com/2010/10/17/celery-rabbitmq-and-sending-messages-directly/
-">Celery, RabbitMQ and sending messages directly. (timc3.com)</a></p>
-
-<p class="communitylink"><a href="http://blog.avelino.us/2010/10/cron-dentro-do-django-com-celery.html
-">Cron dentro do Django com Celery (Portugese) (avelino.us)</a></p>
-
-<p class="communitylink"><a href="http://d.hatena.ne.jp/yuku_t/
-">RabbitMQとCeleryを使ってDjangoでジョブキューしてみる (Japanese) (hatena.ne.jp)</a></p>
-
-<p class="communitylink"><a href="http://www.scribd.com/doc/37562923/Kaninchen-Schlangen-RabbitMQ-Python
-">Kaninchen & Schlangen: RabbitMQ & Python (German) (scribd.com)</a></p>
-
-<p class="communitylink"><a href="http://www.scribd.com/doc/39203296/Celery-Eine-asynchrone-Task-Queue-nicht-nur-fur-Django
-">Celery - Eine asynchrone Task Queue (nicht nur) für Django (German) (scribd.com) </a></p>
-
-<p class="communitylink"><a href="http://blog.historio.us/asynchronous-processing-using-celery
-">Asynchronous Processing Using Celery (historio.us)</a></p>
-
-<p class="communitylink"><a href="http://www.slideshare.net/shawnrider/massaging-the-pony-message-queues-and-you
-">"Massaging the Pony: Message Queues and You" (Djangocon 2010)</a></p>
-
-<p class="communitylink"><a href="http://www.slideshare.net/ericholscher/large-problems
-">"Large problems, Mostly Solved" (Djangocon 2010)</a></p>
-
-<p class="communitylink"><a href="http://shawnmilo.blogspot.com/2010/07/simple-celery-with-django-how-to.html
-">A Simple Celery with Django How-To (shawnmilo.blogspot.com)</a></p>
-
-<p class="communitylink"><a href="http://www.davidfischer.name/2010/09/django-and-asynchronous-jobs/
-">Django and asynchronous jobs (davidfischer.com)</a></p>
-
-<p class="communitylink"><a href="http://www.proft.com.ua/2010/09/4/celery-dobavlyaem-parallelizm-v-django/
-">Celery: добавляем параллелизм в Django (Russian) (proft.com.ua)</a></p>
-
-<p class="communitylink"><a href="http://in.pycon.org/2010/static/files/talks/50/mahendra-celery-pycon-2010.pdf
-">Celery presentation at PyCon India 2010 (PDF slides) (in.pycon.org)</a></p>
-
-<p class="communitylink"><a href="http://tumblr.whatupderek.com/post/1072002968/celery-django-and-virtualenv-playing-nice
-">celery, django and virtualenv playing nice. (whatupderek.com)</a></p>
-
-<p class="communitylink"><a href="http://justinvoss.wordpress.com/2010/06/22/django-task-queueing-with-celery/
-">Django Task Queueing with Celery (justinvoss.wordpress.com)</a></p>
-
-<p class="communitylink"><a href="http://www.slideshare.net/matclayton/django-celery
-">django-celery presentation at DJUGL 2010. (slideshare.net)</a></p>
-
-<p class="communitylink">
-<a href="http://bitkickers.blogspot.com/2010/07/djangocelery-quickstart-or-how-i.html
-">Django/Celery Quickstart (or, how I learned to stop using cron and love
-celery) (bitkickers.blogsport.com)</a></p>
-
-<p class="communitylink">
-<a href="http://blog.notdot.net/2010/06/Using-Python-magic-to-improve-the-deferred-API
-">Using Python magic to improve the deferred API (notdot.net)</a></p>
-
-<p class="communitylink">
-<a href="http://jasonmbaker.com/how-celery-carrot-and-your-messaging-stack-wo
-">How Celery, Carrot, and your messaging stack work (jasonmbaker.com)</a></p>
-
-<p class="communitylink">
-<a href="http://ericholscher.com/blog/2010/jun/23/large-problems-django-mostly-solved-delayed-execut/
-">Large Problems in Django, Mostly Solved: Delayed Execution (ericholscher.com)</a></p>
-
-<p class="communitylink">
-
-    <div style="width:425px;text-align:left" id="__ss_2089054">
-    <a style="font:14px Helvetica,Arial,Sans-serif;display:block;
-    margin:12px 0 3px 0;text-decoration:underline;" 
-    href="http://www.slideshare.net/idangazit/an-introduction-to-celery"
-    title="An Introduction to Celery">An Introduction to Celery</a>
-    <object style="margin:0px" width="425" height="355"> <param name="movie"
-    value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pyweb-celery-090929081406-phpapp01&stripped_title=an-introduction-to-celery" />
-    <param name="allowFullScreen" value="true"/><param name="allowScriptAccess"
-    value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pyweb-celery-090929081406-phpapp01&stripped_title=an-introduction-to-celery" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355">
-    </embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more
-    <a style="text-decoration:underline;"
-    href="http://www.slideshare.net/">documents</a>
-    from <a style="text-decoration:underline;"
-    href="http://www.slideshare.net/idangazit">Idan Gazit</a>.</div></div>
-</p>
-
-<p class="communitylink">
-<a href="http://robertpogorzelski.com/blog/2009/09/10/rabbitmq-celery-and-django/
-">RabbitMQ, Celery and Django (robertpogorzelski.com)</a>
-
-<p>
-Great Celery tutorial by Robert Pogorzelski at his blog "Happy Stream of
-Thoughts"</p>
-
-<p class="communitylink">
-<a href="http://mathematism.com/2010/feb/16/message-queues-django-and-celery-quick-start/
-">Message Queues, Django and Celery Quick Start (mathematism.com)</a>
-</p>
-
-<p class="communitylink">
-<a href="http://www.turnkeylinux.org/blog/django-celery-rabbitmq
-">Background task processing and deferred execution in Django (turnkeylinux.org)</a>.
-</p>
-
-<p class="communitylink">
-<a href="http://timbull.com/build-a-processing-queue-with-multi-threading
-">Build a processing queue [...] in less than a day using RabbitMQ and
-Celery (timbull.com)</a>
-
-<p class="communitylink">
-<a href="http://www.playingwithwire.com/2009/10/how-to-get-celeryd-to-work-on-freebsd/
-">How to get celeryd to work on FreeBSD (playingwithwire.com)</a>
-
-<p>
-Installing multiprocessing on FreeBSD isn't that easy, but thanks to Viktor Petersson
-we now have a step-to-step guide.
-</p>
-
-<p class="communitylink">
-<a href="http://ojs.pythonpapers.org/index.php/tppm/article/viewFile/105/122
-">Web-based 3D animation software (PDF) (ojs.pythonpapers.org)</a></p>
-<p>
-Indy Chang Liu at ThinkingCactus uses Celery to render animations
-asynchronously.
-</p>
-
-<p class="communitylink">
-<a href="http://stepsandnumbers.com/archive/2010/01/04/queued-storage-backend-for-django/
-">Queued Storage Backend for Django (stepsandnumbers.com)</a>
-</p>
-
-<p class="communitylink">
-<a href="http://www.slideshare.net/hungryblank/rabbitmq-with-python-and-ruby-rupy-2009
-">RabbitMQ with Python and Ruby (RuPy 2009) (slideshare.net)</a>
-</p>
-    </div>
-
-
-<div class="column side">
-    <h2>Resources</h2>
-
-    <ul>
-        <li><a
-            href="http://wiki.github.com/ask/celery">Who's using Celery</a></li>
-        <li><a href="http://wiki.github.com/ask/celery/">Celery
-            Wiki</a></li>
-        <li><a
-            href="http://stackoverflow.com/search?q=celery&tab=newest">Celery
-            questions on Stack Overflow</a></li>
-        <li><a
-            href="http://blog.gmane.org/gmane.comp.python.amqp.celery.user">celery-users
-            mailing list archive</a></li>
-        <li><a href="http://botland.oebfare.com/logger/celery/">IRC Logs
-            for the <code>#celery</code> channel</a></li>
-    </ul>
-    </div>
-    <div style="clear:both"></div>
-    </div>
-
- <div id="credits">
-   <ul>
-     <li>
-       <strong>Copyright (c) 2009, 2011</strong>
-       <span><a href="http://twitter.com/asksol">Ask Solem</a> and
-         <a href="http://github.com/ask/celery/blob/master/AUTHORS">contributors</a>.</span>
-     </li>
-     <li>
-       <strong>Web Design</strong>
-       <span><a href="http://www.helmersworks.com/">Jan Henrik Helmers</a></span>
-     </li>
-   </ul>
- </div>
-
-
-</div>
-</body>
-</html>
-
-<!-- This document saved from http://celeryproject.org/ -->

BIN
docs/homepage/documentation.png


+ 0 - 4
docs/homepage/examplerun.txt

@@ -1,4 +0,0 @@
-
->>> result = add.delay(8, 8)
->>> result.wait() # wait for and return the result
-16

+ 0 - 6
docs/homepage/exampletask.txt

@@ -1,6 +0,0 @@
-from celery.task import task
-
-
-@task
-def add(x, y):
-    return x + y

BIN
docs/homepage/favicon.png


BIN
docs/homepage/favicon0.png


BIN
docs/homepage/favicon_128.png


BIN
docs/homepage/favicon_32.png


BIN
docs/homepage/favicon_64.png


Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 39
docs/homepage/index.html


BIN
docs/homepage/logo0000.png


+ 0 - 209
docs/homepage/main0000.css

@@ -1,209 +0,0 @@
-body {
-  background: #9aa090 url(bg.png) 50% 0 repeat;
-  color: #230;
-  font: 15px/1.75em Georgia, serif;
-  margin: 0;
-  overflow-x: hidden;
-  overflow-y: scroll;
-}
-
-a {
-  color: #230;
-  text-decoration: none;
-  border-bottom: 2px solid #959989;
-  -webkit-transition: 0.2s;
-  background-color: rgba(0,0,0,0.05);
-}
-
-a:hover {
-  color: #2c3c00;
-  background-color: #c3dc64;
-  border-color: #779820;
-}
-
-.iStretch {
-  margin: 0 auto;
-  width: 820px;
-}
-
-.highlight {
-  background: #222;
-  border: 5px solid #222;
-  border-radius: 3px;
-}
-
-#navbar {
-  font-size: 0.85em;
-  line-height: 1.7em;
-  position: fixed;
-  height: 23px;
-  top: 0;
-  left: 0;
-  right: 0;
-  overflow: hidden;
-}
-
-#navbar .iStretch {
- height: 23px;
- overflow: hidden;
-}
-
-#navbar .iStretch div {
-  float: right;
-  padding: 1px 10px;
-  margin: 0;
-  text-align: center;
-  -webkit-transition: 0.2s;
-}
-
-#navbar .iStretch div:hover {
-  color: #2c3c00;
-  background-color: #c3dc64;
-}
-
-#navbar a {
-  background-color: transparent;
-  border: none;
-}
-
-#navbar .iStretch div#current {
-  float: left;
-  background-color: #959989;
-}
-
-#topcontainer {
-  padding: 65px 0 25px 0;
-  text-align: right;
-  background: transparent url(logo0000.png) 0% 50% no-repeat;
-}
-
-#topcontainer ul{
-  display: inline-block;
-  width: 420px;
-  height: 100px;
-  padding: 0;
-  margin: 0;
-  list-style: none;
-  overflow: hidden;
-}
-
-#topcontainer ul li{
-  display: inline-block;
-  text-align: center;
-  padding: 0 10px;
-  width: 190px;
-  color: rgba(0,0,0,0.5);
-  text-shadow: 0 2px 5px rgba(0,0,0,0.5);
-}
-
-#contentcontainer, #navbar {
-  background: transparent url(white_50.png);
-  outline: 1px solid #797e6c;
-  box-shadow: 0 0 5px #4e543f;
-  -webkit-box-shadow: 0 0 5px #4e543f;
-  -moz-box-shadow: 0 0 5px #4e543f;
-}
-
-.column {
-  line-height: 1.6em;
-  width: 440px;
-  padding: 40px 20px 0 40px;
-  font-size: 0.9em;
-  vertical-align: top;
-  padding-bottom: 30px;
-  display: block;
-  float: left;
-}
-
-.column.side {
-  width: 250px;
-  float: right;
-  padding: 40px 36px 0 30px;
-  background: transparent url(black_10.png);
-}
-
-#credits ul {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-
-#credits ul li {
-  font-size: 0.85em;
-  float: left;
-  vertical-align: top;
-  width: 185px;
-  padding: 10px;
-}
-
-#credits ul li strong{
-  display: block;
-}
-
-
-/* Restyling default elements */
-h2 {
-  margin-top: 0;
-  margin-bottom: 0;
-  font-size: 1.7em;
-  font-weight: normal;
-  line-height: 1em;
-}
-
-h3 {
-  margin-bottom: 0;
-  font-size: 1.2em;
-}
-
-.newsitem h2 {
-  text-shadow: none;
-}
-
-.newsitem h4 {
-  font-size: 0.8em;
-  margin: 0;
-  margin-bottom: 1.15em;
-  font-weight: normal;
-}
-
-p.introduction {
-  line-height: 1.6em;
-  font-weight: bold;
-}
-
-hr {
-  border-top: 1px dashed #547a1a;
-  border-bottom: none;
-  margin-top: 20px;
-}
-
-.hidden {
-    color: #e1edc1;
-}
-
-
-/* Adapting to small screens */
-
-@media (max-width: 500px) {
-  .iStretch {
-    width: 90%;
-  }
-
-  .column, .column.side {
-    width: 88%;
-    padding: 7%;
-    overflow: hidden;
-  }
-
-  #topcontainer {
-    background-position: 50% 50%;
-  }
-
-  #topcontainer ul{
-    visibility: hidden;
-  }
-
-  #contentcontainer {
-    overflow: hidden;
-  }
-}

+ 0 - 9
docs/homepage/point0.html

@@ -1,9 +0,0 @@
-      <span class="newsitem">
-      <h2>Celery 1.0 released</h2>
-      <h4>By Ask on 06.02.2010</h4>
-      <p>Celery 1.0 has finally been released! It's available on <a
-          href="#">PyPI</a> for downloading. You can also install it via <code>pip install -U
-          celery</code>. You can read the announcement <a href="#">here</a></p>
-      <hr>
-      </span>
-

+ 0 - 69
docs/homepage/trac0000.css

@@ -1,69 +0,0 @@
-.hll { background-color: #404040 }
-.c { color: #999999; font-style: italic } /* Comment */
-.err { color: #a61717; background-color: #e3d2d2 } /* Error */
-.g { color: #d0d0d0 } /* Generic */
-.k { color: #6ab825; font-weight: bold } /* Keyword */
-.l { color: #d0d0d0 } /* Literal */
-.n { color: #d0d0d0 } /* Name */
-.o { color: #d0d0d0 } /* Operator */
-.x { color: #d0d0d0 } /* Other */
-.p { color: #d0d0d0 } /* Punctuation */
-.cm { color: #999999; font-style: italic } /* Comment.Multiline */
-.cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
-.c1 { color: #999999; font-style: italic } /* Comment.Single */
-.cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-.gd { color: #d22323 } /* Generic.Deleted */
-.ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-.gr { color: #d22323 } /* Generic.Error */
-.gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
-.gi { color: #589819 } /* Generic.Inserted */
-.go { color: #cccccc } /* Generic.Output */
-.gp { color: #aaaaaa } /* Generic.Prompt */
-.gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-.gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-.gt { color: #d22323 } /* Generic.Traceback */
-.kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */
-.kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */
-.kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */
-.kp { color: #6ab825 } /* Keyword.Pseudo */
-.kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */
-.kt { color: #6ab825; font-weight: bold } /* Keyword.Type */
-.ld { color: #d0d0d0 } /* Literal.Date */
-.m { color: #3677a9 } /* Literal.Number */
-.s { color: #ed9d13 } /* Literal.String */
-.na { color: #bbbbbb } /* Name.Attribute */
-.nb { color: #24909d } /* Name.Builtin */
-.nc { color: #447fcf; text-decoration: underline } /* Name.Class */
-.no { color: #40ffff } /* Name.Constant */
-.nd { color: #ffa500 } /* Name.Decorator */
-.ni { color: #d0d0d0 } /* Name.Entity */
-.ne { color: #bbbbbb } /* Name.Exception */
-.nf { color: #447fcf } /* Name.Function */
-.nl { color: #d0d0d0 } /* Name.Label */
-.nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */
-.nx { color: #d0d0d0 } /* Name.Other */
-.py { color: #d0d0d0 } /* Name.Property */
-.nt { color: #6ab825; font-weight: bold } /* Name.Tag */
-.nv { color: #40ffff } /* Name.Variable */
-.ow { color: #6ab825; font-weight: bold } /* Operator.Word */
-.w { color: #666666 } /* Text.Whitespace */
-.mf { color: #3677a9 } /* Literal.Number.Float */
-.mh { color: #3677a9 } /* Literal.Number.Hex */
-.mi { color: #3677a9 } /* Literal.Number.Integer */
-.mo { color: #3677a9 } /* Literal.Number.Oct */
-.sb { color: #ed9d13 } /* Literal.String.Backtick */
-.sc { color: #ed9d13 } /* Literal.String.Char */
-.sd { color: #ed9d13 } /* Literal.String.Doc */
-.s2 { color: #ed9d13 } /* Literal.String.Double */
-.se { color: #ed9d13 } /* Literal.String.Escape */
-.sh { color: #ed9d13 } /* Literal.String.Heredoc */
-.si { color: #ed9d13 } /* Literal.String.Interpol */
-.sx { color: #ffa500 } /* Literal.String.Other */
-.sr { color: #ed9d13 } /* Literal.String.Regex */
-.s1 { color: #ed9d13 } /* Literal.String.Single */
-.ss { color: #ed9d13 } /* Literal.String.Symbol */
-.bp { color: #24909d } /* Name.Builtin.Pseudo */
-.vc { color: #40ffff } /* Name.Variable.Class */
-.vg { color: #40ffff } /* Name.Variable.Global */
-.vi { color: #40ffff } /* Name.Variable.Instance */
-.il { color: #3677a9 } /* Literal.Number.Integer.Long */

BIN
docs/homepage/white_50.png


BIN
docs/images/celery_128.png


BIN
docs/images/celery_512.png


+ 1 - 1
docs/includes/introduction.txt

@@ -1,4 +1,4 @@
-:Version: 2.3.0rc2
+:Version: 2.3.0
 :Web: http://celeryproject.org/
 :Download: http://pypi.python.org/pypi/celery/
 :Source: http://github.com/ask/celery/

+ 1 - 1
docs/templates/readme.txt

@@ -2,7 +2,7 @@
  celery - Distributed Task Queue
 =================================
 
-.. image:: http://cloud.github.com/downloads/ask/celery/celery_favicon_128.png
+.. image:: http://cloud.github.com/downloads/ask/celery/celery_128.png
 
 .. include:: ../includes/introduction.txt
 

+ 1 - 0
requirements/py25.txt

@@ -1,2 +1,3 @@
 multiprocessing==2.6.2.1
 importlib
+ordereddict

+ 1 - 0
requirements/py26.txt

@@ -1 +1,2 @@
 importlib
+ordereddict

+ 1 - 0
requirements/test.txt

@@ -7,3 +7,4 @@ mock>=0.7.0
 pytyrant
 redis
 pymongo
+SQLAlchemy

+ 5 - 0
requirements/test_py3k.txt

@@ -0,0 +1,5 @@
+nose
+nose-cover3
+coverage>=3.0
+mock>=0.7.0
+SQLAlchemy

+ 9 - 3
setup.py

@@ -7,7 +7,8 @@ import platform
 
 extra = {}
 tests_require = ["nose", "nose-cover3", "sqlalchemy", "mock"]
-if sys.version_info >= (3, 0):
+is_py3k  = sys.version_info >= (3, 0)
+if is_py3k:
     extra.update(use_2to3=True)
 elif sys.version_info < (2, 7):
     tests_require.append("unittest2")
@@ -52,13 +53,18 @@ install_requires.extend([
     "kombu>=1.2.1,<2.0.0",
     "pyparsing>=1.5.0,<2.0.0",
 ])
+if is_py3k:
+    install_requires.append("python-dateutil>2.0.0")
+else:
+    install_requires.append("python-dateutil>1.5.0,<2.0.0")
+
 py_version = sys.version_info
 is_jython = sys.platform.startswith("java")
 is_pypy = hasattr(sys, "pypy_version_info")
+if sys.version_info < (2, 7):
+    install_requires.append("ordereddict") # Replacement for the ordered dict
 if sys.version_info < (2, 6) and not (is_jython or is_pypy):
     install_requires.append("multiprocessing")
-if sys.version_info < (2, 5):
-    install_requires.append("uuid")
 
 if is_jython:
     install_requires.append("threadpool")

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor