introduction.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>celery - Distributed Task Queue for Django. &mdash; Celery v0.3.7 (unstable) documentation</title>
  7. <link rel="stylesheet" href="static/agogo.css" type="text/css" />
  8. <link rel="stylesheet" href="static/pygments.css" type="text/css" />
  9. <script type="text/javascript">
  10. var DOCUMENTATION_OPTIONS = {
  11. URL_ROOT: '',
  12. VERSION: '0.3.7 (unstable)',
  13. COLLAPSE_MODINDEX: false,
  14. FILE_SUFFIX: '.html',
  15. HAS_SOURCE: true
  16. };
  17. </script>
  18. <script type="text/javascript" src="static/jquery.js"></script>
  19. <script type="text/javascript" src="static/doctools.js"></script>
  20. <link rel="top" title="Celery v0.3.7 (unstable) documentation" href="index.html" />
  21. <link rel="next" title="Frequently Asked Questions" href="faq.html" />
  22. <link rel="prev" title="Welcome to Celery’s documentation!" href="index.html" />
  23. </head>
  24. <body>
  25. <div class="header-wrapper">
  26. <div class="header">
  27. <h1><a href="index.html">Celery v0.3.7 (unstable) documentation</a></h1>
  28. <div class="rel">
  29. <a href="genindex.html" title="General Index"
  30. accesskey="I">index</a> |
  31. <a href="modindex.html" title="Global Module Index"
  32. accesskey="M">modules</a> |
  33. <a href="faq.html" title="Frequently Asked Questions"
  34. accesskey="N">next</a> |
  35. <a href="index.html" title="Welcome to Celery’s documentation!"
  36. accesskey="P">previous</a>
  37. </div>
  38. </div>
  39. </div>
  40. <div class="content-wrapper">
  41. <div class="content">
  42. <div class="document">
  43. <div class="documentwrapper">
  44. <div class="bodywrapper">
  45. <div class="body">
  46. <div class="section" id="celery-distributed-task-queue-for-django">
  47. <h1>celery - Distributed Task Queue for Django.<a class="headerlink" href="#celery-distributed-task-queue-for-django" title="Permalink to this headline">¶</a></h1>
  48. <table class="docutils field-list" frame="void" rules="none">
  49. <col class="field-name" />
  50. <col class="field-body" />
  51. <tbody valign="top">
  52. <tr class="field"><th class="field-name">Version:</th><td class="field-body">0.3.7</td>
  53. </tr>
  54. </tbody>
  55. </table>
  56. <div class="section" id="introduction">
  57. <h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
  58. <p><tt class="docutils literal"><span class="pre">celery</span></tt> is a distributed task queue framework for Django.</p>
  59. <p>It is used for executing tasks <em>asynchronously</em>, routed to one or more
  60. worker servers, running concurrently using multiprocessing.</p>
  61. <p>It is designed to solve certain problems related to running websites
  62. demanding high-availability and performance.</p>
  63. <p>It is perfect for filling caches, posting updates to twitter, mass
  64. downloading data like syndication feeds or web scraping. Use-cases are
  65. plentiful. Implementing these features asynchronously using <tt class="docutils literal"><span class="pre">celery</span></tt> is
  66. easy and fun, and the performance improvements can make it more than
  67. worthwhile.</p>
  68. </div>
  69. <div class="section" id="features">
  70. <h2>Features<a class="headerlink" href="#features" title="Permalink to this headline">¶</a></h2>
  71. <ul class="simple">
  72. <li>Uses AMQP messaging (RabbitMQ, ZeroMQ) to route tasks to the
  73. worker servers.</li>
  74. <li>You can run as many worker servers as you want, and still
  75. be <em>guaranteed that the task is only executed once.</em></li>
  76. <li>Tasks are executed <em>concurrently</em> using the Python 2.6
  77. <tt class="docutils literal"><span class="pre">multiprocessing</span></tt> module (also available as a back-port
  78. to older python versions)</li>
  79. <li>Supports <em>periodic tasks</em>, which makes it a (better) replacement
  80. for cronjobs.</li>
  81. <li>When a task has been executed, the return value is stored using either
  82. a MySQL/Oracle/PostgreSQL/SQLite database, memcached,
  83. or Tokyo Tyrant back-end.</li>
  84. <li>If the task raises an exception, the exception instance is stored,
  85. instead of the return value.</li>
  86. <li>All tasks has a Universally Unique Identifier (UUID), which is the
  87. task id, used for querying task status and return values.</li>
  88. <li>Supports <em>task-sets</em>, which is a task consisting of several sub-tasks.
  89. You can find out how many, or if all of the sub-tasks has been executed.
  90. Excellent for progress-bar like functionality.</li>
  91. <li>Has a <tt class="docutils literal"><span class="pre">map</span></tt> like function that uses tasks, called <tt class="docutils literal"><span class="pre">dmap</span></tt>.</li>
  92. <li>However, you rarely want to wait for these results in a web-environment.
  93. You&#8217;d rather want to use Ajax to poll the task status, which is
  94. available from a URL like <tt class="docutils literal"><span class="pre">celery/&lt;task_id&gt;/status/</span></tt>. This view
  95. returns a JSON-serialized data structure containing the task status,
  96. and the return value if completed, or exception on failure.</li>
  97. </ul>
  98. </div>
  99. <div class="section" id="api-reference-documentation">
  100. <h2>API Reference Documentation<a class="headerlink" href="#api-reference-documentation" title="Permalink to this headline">¶</a></h2>
  101. <p>The <a class="reference external" href="http://ask.github.com/celery/">API Reference</a> is hosted at Github
  102. (<a class="reference external" href="http://ask.github.com/celery">http://ask.github.com/celery</a>)</p>
  103. </div>
  104. <div class="section" id="installation">
  105. <h2>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h2>
  106. <p>You can install <tt class="docutils literal"><span class="pre">celery</span></tt> either via the Python Package Index (PyPI)
  107. or from source.</p>
  108. <p>To install using <tt class="docutils literal"><span class="pre">pip</span></tt>,:</p>
  109. <div class="highlight-python"><pre>$ pip install celery</pre>
  110. </div>
  111. <p>To install using <tt class="docutils literal"><span class="pre">easy_install</span></tt>,:</p>
  112. <div class="highlight-python"><pre>$ easy_install celery</pre>
  113. </div>
  114. <div class="section" id="downloading-and-installing-from-source">
  115. <h3>Downloading and installing from source<a class="headerlink" href="#downloading-and-installing-from-source" title="Permalink to this headline">¶</a></h3>
  116. <p>Download the latest version of <tt class="docutils literal"><span class="pre">celery</span></tt> from
  117. <a class="reference external" href="http://pypi.python.org/pypi/celery/">http://pypi.python.org/pypi/celery/</a></p>
  118. <p>You can install it by doing the following,:</p>
  119. <div class="highlight-python"><pre>$ tar xvfz celery-0.0.0.tar.gz
  120. $ cd celery-0.0.0
  121. $ python setup.py build
  122. # python setup.py install # as root</pre>
  123. </div>
  124. </div>
  125. <div class="section" id="using-the-development-version">
  126. <h3>Using the development version<a class="headerlink" href="#using-the-development-version" title="Permalink to this headline">¶</a></h3>
  127. <p>You can clone the repository by doing the following:</p>
  128. <div class="highlight-python"><pre>$ git clone git://github.com/ask/celery.git celery</pre>
  129. </div>
  130. </div>
  131. </div>
  132. <div class="section" id="usage">
  133. <h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline">¶</a></h2>
  134. <div class="section" id="installing-rabbitmq">
  135. <h3>Installing RabbitMQ<a class="headerlink" href="#installing-rabbitmq" title="Permalink to this headline">¶</a></h3>
  136. <p>See <a class="reference external" href="http://www.rabbitmq.com/install.html">Installing RabbitMQ</a> over at RabbitMQ&#8217;s website. For Mac OS X
  137. see <a class="reference external" href="http://playtype.net/past/2008/10/9/installing_rabbitmq_on_osx/">Installing RabbitMQ on OS X</a>.</p>
  138. </div>
  139. <div class="section" id="setting-up-rabbitmq">
  140. <h3>Setting up RabbitMQ<a class="headerlink" href="#setting-up-rabbitmq" title="Permalink to this headline">¶</a></h3>
  141. <p>To use celery we need to create a RabbitMQ user, a virtual host and
  142. allow that user access to that virtual host:</p>
  143. <div class="highlight-python"><pre>$ rabbitmqctl add_user myuser mypassword
  144. $ rabbitmqctl add_vhost myvhost
  145. $ rabbitmqctl map_user_vhost myuser myvhost</pre>
  146. </div>
  147. </div>
  148. <div class="section" id="configuring-your-django-project-to-use-celery">
  149. <h3>Configuring your Django project to use Celery<a class="headerlink" href="#configuring-your-django-project-to-use-celery" title="Permalink to this headline">¶</a></h3>
  150. <p>You only need three simple steps to use celery with your Django project.</p>
  151. <ol class="arabic">
  152. <li><p class="first">Add <tt class="docutils literal"><span class="pre">celery</span></tt> to <tt class="docutils literal"><span class="pre">INSTALLED_APPS</span></tt>.</p>
  153. </li>
  154. <li><p class="first">Create the celery database tables:</p>
  155. <div class="highlight-python"><pre>$ python manage.py syncdb</pre>
  156. </div>
  157. </li>
  158. <li><dl class="first docutils">
  159. <dt>Configure celery to use the AMQP user and virtual host we created</dt>
  160. <dd><p class="first">before, by adding the following to your <tt class="docutils literal"><span class="pre">settings.py</span></tt>:</p>
  161. <div class="last highlight-python"><div class="highlight"><pre><span class="n">AMQP_SERVER</span> <span class="o">=</span> <span class="s">&quot;localhost&quot;</span>
  162. <span class="n">AMQP_PORT</span> <span class="o">=</span> <span class="mf">5672</span>
  163. <span class="n">AMQP_USER</span> <span class="o">=</span> <span class="s">&quot;myuser&quot;</span>
  164. <span class="n">AMQP_PASSWORD</span> <span class="o">=</span> <span class="s">&quot;mypassword&quot;</span>
  165. <span class="n">AMQP_VHOST</span> <span class="o">=</span> <span class="s">&quot;myvhost&quot;</span>
  166. </pre></div>
  167. </div>
  168. </dd>
  169. </dl>
  170. </li>
  171. </ol>
  172. <p>That&#8217;s it.</p>
  173. <p>There are more options available, like how many processes you want to process
  174. work in parallel (the <tt class="docutils literal"><span class="pre">CELERY_CONCURRENCY</span></tt> setting), and the backend used
  175. for storing task statuses. But for now, this should do. For all of the options
  176. available, please consult the <a class="reference external" href="http://ask.github.com/celery/">API Reference</a></p>
  177. <p><strong>Note</strong>: If you&#8217;re using SQLite as the Django database back-end,
  178. <tt class="docutils literal"><span class="pre">celeryd</span></tt> will only be able to process one task at a time, this is
  179. because SQLite doesn&#8217;t allow concurrent writes.</p>
  180. </div>
  181. <div class="section" id="running-the-celery-worker-server">
  182. <h3>Running the celery worker server<a class="headerlink" href="#running-the-celery-worker-server" title="Permalink to this headline">¶</a></h3>
  183. <p>To test this we&#8217;ll be running the worker server in the foreground, so we can
  184. see what&#8217;s going on without consulting the logfile:</p>
  185. <div class="highlight-python"><pre>$ python manage.py celeryd</pre>
  186. </div>
  187. <p>However, in production you&#8217;ll probably want to run the worker in the
  188. background as a daemon instead:</p>
  189. <div class="highlight-python"><pre>$ python manage.py celeryd --detach</pre>
  190. </div>
  191. <p>For help on command line arguments to the worker server, you can execute the
  192. help command:</p>
  193. <div class="highlight-python"><pre>$ python manage.py help celeryd</pre>
  194. </div>
  195. </div>
  196. <div class="section" id="defining-and-executing-tasks">
  197. <h3>Defining and executing tasks<a class="headerlink" href="#defining-and-executing-tasks" title="Permalink to this headline">¶</a></h3>
  198. <p><strong>Please note</strong> All of these tasks has to be stored in a real module, they can&#8217;t
  199. be defined in the python shell or ipython/bpython. This is because the celery
  200. worker server needs access to the task function to be able to run it.
  201. So while it looks like we use the python shell to define the tasks in these
  202. examples, you can&#8217;t do it this way. Put them in the <tt class="docutils literal"><span class="pre">tasks</span></tt> module of your
  203. Django application. The worker server will automatically load any <tt class="docutils literal"><span class="pre">tasks.py</span></tt>
  204. file for all of the applications listed in <tt class="docutils literal"><span class="pre">settings.INSTALLED_APPS</span></tt>.
  205. Executing tasks using <tt class="docutils literal"><span class="pre">delay</span></tt> and <tt class="docutils literal"><span class="pre">apply_async</span></tt> can be done from the
  206. python shell, but keep in mind that since arguments are pickled, you can&#8217;t
  207. use custom classes defined in the shell session.</p>
  208. <p>While you can use regular functions, the recommended way is to define
  209. a task class. With this way you can cleanly upgrade the task to use the more
  210. advanced features of celery later.</p>
  211. <p>This is a task that basically does nothing but take some arguments,
  212. and return a value:</p>
  213. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">celery.task</span> <span class="kn">import</span> <span class="n">Task</span><span class="p">,</span> <span class="n">tasks</span>
  214. <span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">MyTask</span><span class="p">(</span><span class="n">Task</span><span class="p">):</span>
  215. <span class="gp">... </span> <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;myapp.mytask&quot;</span>
  216. <span class="gp">... </span> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">some_arg</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
  217. <span class="gp">... </span> <span class="n">logger</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_logger</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
  218. <span class="gp">... </span> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Did something: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">some_arg</span><span class="p">)</span>
  219. <span class="gp">... </span> <span class="k">return</span> <span class="mf">42</span>
  220. <span class="gp">&gt;&gt;&gt; </span><span class="n">tasks</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">MyTask</span><span class="p">)</span>
  221. </pre></div>
  222. </div>
  223. <p>Now if we want to execute this task, we can use the <tt class="docutils literal"><span class="pre">delay</span></tt> method of the
  224. task class (this is a handy shortcut to the <tt class="docutils literal"><span class="pre">apply_async</span></tt> method which gives
  225. you greater control of the task execution).</p>
  226. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">myapp.tasks</span> <span class="kn">import</span> <span class="n">MyTask</span>
  227. <span class="gp">&gt;&gt;&gt; </span><span class="n">MyTask</span><span class="o">.</span><span class="n">delay</span><span class="p">(</span><span class="n">some_arg</span><span class="o">=</span><span class="s">&quot;foo&quot;</span><span class="p">)</span>
  228. </pre></div>
  229. </div>
  230. <p>At this point, the task has been sent to the message broker. The message
  231. broker will hold on to the task until a celery worker server has successfully
  232. picked it up.</p>
  233. <p>Right now we have to check the celery worker logfiles to know what happened with
  234. the task. This is because we didn&#8217;t keep the <tt class="docutils literal"><span class="pre">AsyncResult</span></tt> object returned
  235. by <tt class="docutils literal"><span class="pre">delay</span></tt>.</p>
  236. <p>The <tt class="docutils literal"><span class="pre">AsyncResult</span></tt> lets us find the state of the task, wait for the task to
  237. finish and get its return value (or exception if the task failed).</p>
  238. <p>So, let&#8217;s execute the task again, but this time we&#8217;ll keep track of the task:</p>
  239. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">result</span> <span class="o">=</span> <span class="n">MyTask</span><span class="o">.</span><span class="n">delay</span><span class="p">(</span><span class="s">&quot;do_something&quot;</span><span class="p">,</span> <span class="n">some_arg</span><span class="o">=</span><span class="s">&quot;foo bar baz&quot;</span><span class="p">)</span>
  240. <span class="gp">&gt;&gt;&gt; </span><span class="n">result</span><span class="o">.</span><span class="n">ready</span><span class="p">()</span> <span class="c"># returns True if the task has finished processing.</span>
  241. <span class="go">False</span>
  242. <span class="gp">&gt;&gt;&gt; </span><span class="n">result</span><span class="o">.</span><span class="n">result</span> <span class="c"># task is not ready, so no return value yet.</span>
  243. <span class="go">None</span>
  244. <span class="gp">&gt;&gt;&gt; </span><span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="c"># Waits until the task is done and return the retval.</span>
  245. <span class="go">42</span>
  246. <span class="gp">&gt;&gt;&gt; </span><span class="n">result</span><span class="o">.</span><span class="n">result</span>
  247. <span class="go">42</span>
  248. <span class="gp">&gt;&gt;&gt; </span><span class="n">result</span><span class="o">.</span><span class="n">success</span><span class="p">()</span> <span class="c"># returns True if the task didn&#39;t end in failure.</span>
  249. <span class="go">True</span>
  250. </pre></div>
  251. </div>
  252. <p>If the task raises an exception, the <tt class="docutils literal"><span class="pre">result.success()</span></tt> will be <tt class="xref docutils literal"><span class="pre">False</span></tt>,
  253. and <tt class="docutils literal"><span class="pre">result.result</span></tt> will contain the exception instance raised.</p>
  254. </div>
  255. <div class="section" id="auto-discovery-of-tasks">
  256. <h3>Auto-discovery of tasks<a class="headerlink" href="#auto-discovery-of-tasks" title="Permalink to this headline">¶</a></h3>
  257. <p><tt class="docutils literal"><span class="pre">celery</span></tt> has an auto-discovery feature like the Django Admin, that
  258. automatically loads any <tt class="docutils literal"><span class="pre">tasks.py</span></tt> module in the applications listed
  259. in <tt class="docutils literal"><span class="pre">settings.INSTALLED_APPS</span></tt>. This autodiscovery is used by the celery
  260. worker to find registered tasks for your Django project.</p>
  261. </div>
  262. <div class="section" id="periodic-tasks">
  263. <h3>Periodic Tasks<a class="headerlink" href="#periodic-tasks" title="Permalink to this headline">¶</a></h3>
  264. <p>Periodic tasks are tasks that are run every <tt class="docutils literal"><span class="pre">n</span></tt> seconds.
  265. Here&#8217;s an example of a periodic task:</p>
  266. <div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">celery.task</span> <span class="kn">import</span> <span class="n">tasks</span><span class="p">,</span> <span class="n">PeriodicTask</span>
  267. <span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span>
  268. <span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">MyPeriodicTask</span><span class="p">(</span><span class="n">PeriodicTask</span><span class="p">):</span>
  269. <span class="gp">... </span> <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;foo.my-periodic-task&quot;</span>
  270. <span class="gp">... </span> <span class="n">run_every</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mf">30</span><span class="p">)</span>
  271. <span class="gp">...</span>
  272. <span class="gp">... </span> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
  273. <span class="gp">... </span> <span class="n">logger</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_logger</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
  274. <span class="gp">... </span> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Running periodic task!&quot;</span><span class="p">)</span>
  275. <span class="gp">...</span>
  276. <span class="gp">&gt;&gt;&gt; </span><span class="n">tasks</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">MyPeriodicTask</span><span class="p">)</span>
  277. </pre></div>
  278. </div>
  279. <p><strong>Note:</strong> Periodic tasks does not support arguments, as this doesn&#8217;t
  280. really make sense.</p>
  281. </div>
  282. </div>
  283. <div class="section" id="getting-help">
  284. <h2>Getting Help<a class="headerlink" href="#getting-help" title="Permalink to this headline">¶</a></h2>
  285. <div class="section" id="mailing-list">
  286. <h3>Mailing list<a class="headerlink" href="#mailing-list" title="Permalink to this headline">¶</a></h3>
  287. <p>For discussions about the usage, development, and future of celery,
  288. please join the <a class="reference external" href="http://groups.google.com/group/celery-users/">celery-users</a> mailing list.</p>
  289. </div>
  290. <div class="section" id="irc">
  291. <h3>IRC<a class="headerlink" href="#irc" title="Permalink to this headline">¶</a></h3>
  292. <p>Come chat with us on IRC. The <a class="reference external" href="irc://irc.freenode.net/celery">#celery</a> channel is located at the <a class="reference external" href="http://freenode.net">Freenode</a>
  293. network.</p>
  294. </div>
  295. </div>
  296. <div class="section" id="bug-tracker">
  297. <h2>Bug tracker<a class="headerlink" href="#bug-tracker" title="Permalink to this headline">¶</a></h2>
  298. <p>If you have any suggestions, bug reports or annoyances please report them
  299. to our issue tracker at <a class="reference external" href="http://github.com/ask/celery/issues/">http://github.com/ask/celery/issues/</a></p>
  300. </div>
  301. <div class="section" id="contributing">
  302. <h2>Contributing<a class="headerlink" href="#contributing" title="Permalink to this headline">¶</a></h2>
  303. <p>Development of <tt class="docutils literal"><span class="pre">celery</span></tt> happens at Github: <a class="reference external" href="http://github.com/ask/celery">http://github.com/ask/celery</a></p>
  304. <p>You are highly encouraged to participate in the development
  305. of <tt class="docutils literal"><span class="pre">celery</span></tt>. If you don&#8217;t like Github (for some reason) you&#8217;re welcome
  306. to send regular patches.</p>
  307. </div>
  308. <div class="section" id="license">
  309. <h2>License<a class="headerlink" href="#license" title="Permalink to this headline">¶</a></h2>
  310. <p>This software is licensed under the <tt class="docutils literal"><span class="pre">New</span> <span class="pre">BSD</span> <span class="pre">License</span></tt>. See the <tt class="docutils literal"><span class="pre">LICENSE</span></tt>
  311. file in the top distribution directory for the full license text.</p>
  312. </div>
  313. </div>
  314. </div>
  315. </div>
  316. </div>
  317. </div>
  318. <div class="sidebar">
  319. <h3>Contents</h3>
  320. <ul class="current">
  321. <li class="toctree-l1 current"><a class="current reference external" href="">celery - Distributed Task Queue for Django.</a><ul>
  322. <li class="toctree-l2"><a class="reference external" href="#introduction">Introduction</a></li>
  323. <li class="toctree-l2"><a class="reference external" href="#features">Features</a></li>
  324. <li class="toctree-l2"><a class="reference external" href="#api-reference-documentation">API Reference Documentation</a></li>
  325. <li class="toctree-l2"><a class="reference external" href="#installation">Installation</a></li>
  326. <li class="toctree-l2"><a class="reference external" href="#usage">Usage</a></li>
  327. <li class="toctree-l2"><a class="reference external" href="#getting-help">Getting Help</a></li>
  328. <li class="toctree-l2"><a class="reference external" href="#bug-tracker">Bug tracker</a></li>
  329. <li class="toctree-l2"><a class="reference external" href="#contributing">Contributing</a></li>
  330. <li class="toctree-l2"><a class="reference external" href="#license">License</a></li>
  331. </ul>
  332. </li>
  333. <li class="toctree-l1"><a class="reference external" href="faq.html">Frequently Asked Questions</a></li>
  334. <li class="toctree-l1"><a class="reference external" href="reference/index.html">Module API Reference</a></li>
  335. <li class="toctree-l1"><a class="reference external" href="changelog.html">Change history</a></li>
  336. </ul>
  337. <h3 style="margin-top: 1.5em;">Search</h3>
  338. <form class="search" action="search.html" method="get">
  339. <input type="text" name="q" size="18" />
  340. <input type="submit" value="Go" />
  341. <input type="hidden" name="check_keywords" value="yes" />
  342. <input type="hidden" name="area" value="default" />
  343. </form>
  344. <p class="searchtip" style="font-size: 90%">
  345. Enter search terms or a module, class or function name.
  346. </p>
  347. </div>
  348. <div class="clearer"></div>
  349. </div>
  350. </div>
  351. <div class="footer-wrapper">
  352. <div class="footer">
  353. <div class="left">
  354. <a href="genindex.html" title="General Index"
  355. >index</a> |
  356. <a href="modindex.html" title="Global Module Index"
  357. >modules</a> |
  358. <a href="faq.html" title="Frequently Asked Questions"
  359. >next</a> |
  360. <a href="index.html" title="Welcome to Celery’s documentation!"
  361. >previous</a>
  362. <br/>
  363. <a href="sources/introduction.txt"
  364. rel="nofollow">Show Source</a>
  365. </div>
  366. <div class="right">
  367. &copy; Copyright 2009, Ask Solem.<br/>
  368. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.1.
  369. </div>
  370. <div class="clearer"></div>
  371. </div>
  372. </div>
  373. </body>
  374. </html>