File: //usr/share/doc/python3-django-q/html/cluster.html
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Cluster — Django Q2 1.6.1 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b76e3c8a" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=86f27845" />
<link rel="shortcut icon" href="_static/favicon.ico"/>
<script src="_static/jquery.js?v=8dae8fb0"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=d6a008b6"></script>
<script src="_static/doctools.js?v=888ff710"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Monitor" href="monitor.html" />
<link rel="prev" title="Schedules" href="schedules.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Django Q2
</a>
<div class="version">
1.6
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="install.html"> Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="configure.html"> Configuration</a></li>
<li class="toctree-l1"><a class="reference internal" href="brokers.html"> Brokers</a></li>
<li class="toctree-l1"><a class="reference internal" href="tasks.html"> Tasks</a></li>
<li class="toctree-l1"><a class="reference internal" href="group.html"> Groups</a></li>
<li class="toctree-l1"><a class="reference internal" href="iterable.html"> Iterable</a></li>
<li class="toctree-l1"><a class="reference internal" href="chain.html"> Chains</a></li>
<li class="toctree-l1"><a class="reference internal" href="schedules.html"> Schedules</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#"> Cluster</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#multiple-clusters">Multiple Clusters</a></li>
<li class="toctree-l2"><a class="reference internal" href="#multiple-queues">Multiple Queues</a></li>
<li class="toctree-l2"><a class="reference internal" href="#using-a-procfile">Using a Procfile</a></li>
<li class="toctree-l2"><a class="reference internal" href="#process-managers">Process managers</a></li>
<li class="toctree-l2"><a class="reference internal" href="#reference">Reference</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#django_q.Cluster"><code class="docutils literal notranslate"><span class="pre">Cluster</span></code></a><ul>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.start"><code class="docutils literal notranslate"><span class="pre">Cluster.start()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.stop"><code class="docutils literal notranslate"><span class="pre">Cluster.stop()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.stat"><code class="docutils literal notranslate"><span class="pre">Cluster.stat()</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.pid"><code class="docutils literal notranslate"><span class="pre">Cluster.pid</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.host"><code class="docutils literal notranslate"><span class="pre">Cluster.host</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.sentinel"><code class="docutils literal notranslate"><span class="pre">Cluster.sentinel</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.timeout"><code class="docutils literal notranslate"><span class="pre">Cluster.timeout</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.start_event"><code class="docutils literal notranslate"><span class="pre">Cluster.start_event</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.stop_event"><code class="docutils literal notranslate"><span class="pre">Cluster.stop_event</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.is_starting"><code class="docutils literal notranslate"><span class="pre">Cluster.is_starting</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.is_running"><code class="docutils literal notranslate"><span class="pre">Cluster.is_running</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.is_stopping"><code class="docutils literal notranslate"><span class="pre">Cluster.is_stopping</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#django_q.Cluster.has_stopped"><code class="docutils literal notranslate"><span class="pre">Cluster.has_stopped</span></code></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="monitor.html"> Monitor</a></li>
<li class="toctree-l1"><a class="reference internal" href="admin.html"> Admin</a></li>
<li class="toctree-l1"><a class="reference internal" href="errors.html"> Errors</a></li>
<li class="toctree-l1"><a class="reference internal" href="signals.html"> Signals</a></li>
<li class="toctree-l1"><a class="reference internal" href="architecture.html"> Architecture</a></li>
<li class="toctree-l1"><a class="reference internal" href="examples.html"> Examples</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Django Q2</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Cluster</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/cluster.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="cluster">
<h1>Cluster<a class="headerlink" href="#cluster" title="Link to this heading"></a></h1>
<p>Django Q2 uses Python’s multiprocessing module to manage a pool of workers that will handle your tasks.
Start your cluster using Django’s <code class="docutils literal notranslate"><span class="pre">manage.py</span></code> command:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python manage.py qcluster
</pre></div>
</div>
<p>You should see the cluster starting</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Q</span> <span class="n">Cluster</span> <span class="n">freddie</span><span class="o">-</span><span class="n">uncle</span><span class="o">-</span><span class="n">twenty</span><span class="o">-</span><span class="n">ten</span> <span class="n">starting</span><span class="o">.</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">ede257774c4444c980ab479f10947acc</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31784</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">ed580482da3f42968230baa2e4253e42</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31785</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">8</span><span class="n">a370dc2bc1d49aa9864e517c9895f74</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31786</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">74912</span><span class="n">f9844264d1397c6e54476b530c0</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31787</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">b00edb26c6074a6189e5696c60aeb35b</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31788</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">b0862965db04479f9784a26639ee51e0</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31789</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mf">7e8</span><span class="n">abbb8ca2d4d9bb20a937dd5e2872b</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31790</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">b0862965db04479f9784a26639ee51e0</span> <span class="n">ready</span> <span class="k">for</span> <span class="n">work</span> <span class="n">at</span> <span class="mi">31791</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">67</span><span class="n">fa9461ac034736a766cd813f617e62</span> <span class="n">monitoring</span> <span class="n">at</span> <span class="mi">31792</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">eac052c646b2459797cee98bdb84c85d</span> <span class="n">guarding</span> <span class="n">cluster</span> <span class="n">at</span> <span class="mi">31783</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">5</span><span class="n">d98deb19b1e4b2da2ef1e5bd6824f75</span> <span class="n">pushing</span> <span class="n">tasks</span> <span class="n">at</span> <span class="mi">31793</span>
<span class="mi">10</span><span class="p">:</span><span class="mi">57</span><span class="p">:</span><span class="mi">40</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Q</span> <span class="n">Cluster</span> <span class="n">freddie</span><span class="o">-</span><span class="n">uncle</span><span class="o">-</span><span class="n">twenty</span><span class="o">-</span><span class="n">ten</span> <span class="n">running</span><span class="o">.</span>
</pre></div>
</div>
<p>Stopping the cluster with ctrl-c or either the <code class="docutils literal notranslate"><span class="pre">SIGTERM</span></code> and <code class="docutils literal notranslate"><span class="pre">SIGKILL</span></code> signals, will initiate the <a class="reference internal" href="architecture.html#stop-procedure"><span class="std std-ref">Stop procedure</span></a>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">12</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Q</span> <span class="n">Cluster</span> <span class="n">freddie</span><span class="o">-</span><span class="n">uncle</span><span class="o">-</span><span class="n">twenty</span><span class="o">-</span><span class="n">ten</span> <span class="n">stopping</span><span class="o">.</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">12</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">eac052c646b2459797cee98bdb84c85d</span> <span class="n">stopping</span> <span class="n">cluster</span> <span class="n">processes</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">5</span><span class="n">d98deb19b1e4b2da2ef1e5bd6824f75</span> <span class="n">stopped</span> <span class="n">pushing</span> <span class="n">tasks</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">b0862965db04479f9784a26639ee51e0</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mf">7e8</span><span class="n">abbb8ca2d4d9bb20a937dd5e2872b</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">b0862965db04479f9784a26639ee51e0</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">b00edb26c6074a6189e5696c60aeb35b</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">74912</span><span class="n">f9844264d1397c6e54476b530c0</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">8</span><span class="n">a370dc2bc1d49aa9864e517c9895f74</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">ed580482da3f42968230baa2e4253e42</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">13</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="n">ede257774c4444c980ab479f10947acc</span> <span class="n">stopped</span> <span class="n">doing</span> <span class="n">work</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">14</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Process</span><span class="o">-</span><span class="mi">67</span><span class="n">fa9461ac034736a766cd813f617e62</span> <span class="n">stopped</span> <span class="n">monitoring</span> <span class="n">results</span>
<span class="mi">16</span><span class="p">:</span><span class="mi">44</span><span class="p">:</span><span class="mi">15</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="n">INFO</span> <span class="n">Q</span> <span class="n">Cluster</span> <span class="n">freddie</span><span class="o">-</span><span class="n">uncle</span><span class="o">-</span><span class="n">twenty</span><span class="o">-</span><span class="n">ten</span> <span class="n">has</span> <span class="n">stopped</span><span class="o">.</span>
</pre></div>
</div>
<p>The number of workers, optional timeouts, recycles and cpu_affinity can be controlled via the <a class="reference internal" href="configure.html"><span class="doc">Configuration</span></a> settings.</p>
<section id="multiple-clusters">
<h2>Multiple Clusters<a class="headerlink" href="#multiple-clusters" title="Link to this heading"></a></h2>
<p>You can have multiple clusters on multiple machines, working on the same queue as long as:</p>
<ul class="simple">
<li><p>They connect to the same <a class="reference internal" href="brokers.html"><span class="doc">broker</span></a>.</p></li>
<li><p>They use the same cluster name. See <a class="reference internal" href="configure.html"><span class="doc">Configuration</span></a></p></li>
<li><p>They share the same <code class="docutils literal notranslate"><span class="pre">SECRET_KEY</span></code> for Django.</p></li>
</ul>
</section>
<section id="multiple-queues">
<h2>Multiple Queues<a class="headerlink" href="#multiple-queues" title="Link to this heading"></a></h2>
<p>You can have multiple queues in one Django site, and use multiple cluster to work on each queue.
Different queues are identified by different queue names which are also cluster names.
To run an alternate cluster, e.g. to work on the ‘long’ queue, start your cluster with command:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span># On Linux
$ Q_CLUSTER_NAME=long python manage.py qcluster
# On Windows
$ python manage.py qcluster --name long
</pre></div>
</div>
<p>You can set different Q_CLUSTER options for alternative clusters, such as ‘timeout’, ‘queue_limit’
and any other options which are valid in <a class="reference internal" href="configure.html"><span class="doc">Configuration</span></a>. See <a class="reference internal" href="configure.html#alt-clusters"><span class="std std-ref">ALT_CLUSTERS</span></a>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>To use multiple queue, use the keyword argument <cite>cluster</cite> in async_task() and schedule():</p>
<ul class="simple">
<li><p>if <cite>cluster</cite> is not set (the default), async_task() and schedule() will be handled by the default cluster;</p></li>
<li><p>if <cite>cluster</cite> is set, only clusters with matching cluster name will run the task or do the schedule.</p></li>
</ul>
</div>
</section>
<section id="using-a-procfile">
<h2>Using a Procfile<a class="headerlink" href="#using-a-procfile" title="Link to this heading"></a></h2>
<p>If you host on <a class="reference external" href="https://heroku.com">Heroku</a> or you are using <a class="reference external" href="https://github.com/nickstenning/honcho">Honcho</a> you can start the cluster from a <code class="file docutils literal notranslate"><span class="pre">Procfile</span></code> with an entry like this:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">worker</span><span class="p">:</span> <span class="n">python</span> <span class="n">manage</span><span class="o">.</span><span class="n">py</span> <span class="n">qcluster</span>
</pre></div>
</div>
</section>
<section id="process-managers">
<h2>Process managers<a class="headerlink" href="#process-managers" title="Link to this heading"></a></h2>
<p>While you certainly can run a Django Q2 with a process manager like <a class="reference external" href="http://supervisord.org/">Supervisor</a> or <a class="reference external" href="https://circus.readthedocs.org/en/latest/">Circus</a> it is not strictly necessary.
The cluster has an internal sentinel that checks the health of all the processes and recycles or reincarnates according to your settings or in case of unexpected crashes.
Because of the multiprocessing daemonic nature of the cluster, it is impossible for a process manager to determine the clusters health and resource usage.</p>
<p>An example <code class="file docutils literal notranslate"><span class="pre">circus.ini</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">circus</span><span class="p">]</span>
<span class="n">check_delay</span> <span class="o">=</span> <span class="mi">5</span>
<span class="n">endpoint</span> <span class="o">=</span> <span class="n">tcp</span><span class="p">:</span><span class="o">//</span><span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">5555</span>
<span class="n">pubsub_endpoint</span> <span class="o">=</span> <span class="n">tcp</span><span class="p">:</span><span class="o">//</span><span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">5556</span>
<span class="n">stats_endpoint</span> <span class="o">=</span> <span class="n">tcp</span><span class="p">:</span><span class="o">//</span><span class="mf">127.0.0.1</span><span class="p">:</span><span class="mi">5557</span>
<span class="p">[</span><span class="n">watcher</span><span class="p">:</span><span class="n">django_q</span><span class="p">]</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="n">python</span> <span class="n">manage</span><span class="o">.</span><span class="n">py</span> <span class="n">qcluster</span>
<span class="n">numprocesses</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">copy_env</span> <span class="o">=</span> <span class="kc">True</span>
</pre></div>
</div>
<p>Note that we only start one process. It is not a good idea to run multiple instances of the cluster in the same environment since this does nothing to increase performance and in all likelihood will diminish it.
Control your cluster using the <code class="docutils literal notranslate"><span class="pre">workers</span></code>, <code class="docutils literal notranslate"><span class="pre">recycle</span></code> and <code class="docutils literal notranslate"><span class="pre">timeout</span></code> settings in your <a class="reference internal" href="configure.html"><span class="doc">Configuration</span></a></p>
<p>An example <code class="file docutils literal notranslate"><span class="pre">supervisor.conf</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">program</span><span class="p">:</span><span class="n">django</span><span class="o">-</span><span class="n">q</span><span class="p">]</span>
<span class="n">command</span> <span class="o">=</span> <span class="n">python</span> <span class="n">manage</span><span class="o">.</span><span class="n">py</span> <span class="n">qcluster</span>
<span class="n">stopasgroup</span> <span class="o">=</span> <span class="n">true</span>
</pre></div>
</div>
<p>Supervisor’s <code class="docutils literal notranslate"><span class="pre">stopasgroup</span></code> will ensure that the single process doesn’t leave orphan process on stop or restart.</p>
</section>
<section id="reference">
<h2>Reference<a class="headerlink" href="#reference" title="Link to this heading"></a></h2>
<dl class="py class">
<dt class="sig sig-object py" id="django_q.Cluster">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Cluster</span></span><a class="headerlink" href="#django_q.Cluster" title="Link to this definition"></a></dt>
<dd><dl class="py method">
<dt class="sig sig-object py" id="django_q.Cluster.start">
<span class="sig-name descname"><span class="pre">start</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#django_q.Cluster.start" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>Spawns a cluster and then returns</p>
<dl class="py method">
<dt class="sig sig-object py" id="django_q.Cluster.stop">
<span class="sig-name descname"><span class="pre">stop</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#django_q.Cluster.stop" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>Initiates <a class="reference internal" href="architecture.html#stop-procedure"><span class="std std-ref">Stop procedure</span></a> and waits for it to finish.</p>
<dl class="py method">
<dt class="sig sig-object py" id="django_q.Cluster.stat">
<span class="sig-name descname"><span class="pre">stat</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#django_q.Cluster.stat" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>returns a <a class="reference internal" href="monitor.html#Stat" title="Stat"><code class="xref py py-class docutils literal notranslate"><span class="pre">Stat</span></code></a> object with the current cluster status.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.pid">
<span class="sig-name descname"><span class="pre">pid</span></span><a class="headerlink" href="#django_q.Cluster.pid" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>The cluster process id.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.host">
<span class="sig-name descname"><span class="pre">host</span></span><a class="headerlink" href="#django_q.Cluster.host" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>The current hostname</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.sentinel">
<span class="sig-name descname"><span class="pre">sentinel</span></span><a class="headerlink" href="#django_q.Cluster.sentinel" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>returns the <code class="xref py py-class docutils literal notranslate"><span class="pre">multiprocessing.Process</span></code> containing the <a class="reference internal" href="architecture.html#sentinel"><span class="std std-ref">Sentinel</span></a>.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.timeout">
<span class="sig-name descname"><span class="pre">timeout</span></span><a class="headerlink" href="#django_q.Cluster.timeout" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>The clusters timeout setting in seconds</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.start_event">
<span class="sig-name descname"><span class="pre">start_event</span></span><a class="headerlink" href="#django_q.Cluster.start_event" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>A <code class="xref py py-class docutils literal notranslate"><span class="pre">multiprocessing.Event</span></code> indicating if the <a class="reference internal" href="architecture.html#sentinel"><span class="std std-ref">Sentinel</span></a> has finished starting the cluster</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.stop_event">
<span class="sig-name descname"><span class="pre">stop_event</span></span><a class="headerlink" href="#django_q.Cluster.stop_event" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>A <code class="xref py py-class docutils literal notranslate"><span class="pre">multiprocessing.Event</span></code> used to instruct the <a class="reference internal" href="architecture.html#sentinel"><span class="std std-ref">Sentinel</span></a> to initiate the <a class="reference internal" href="architecture.html#stop-procedure"><span class="std std-ref">Stop procedure</span></a></p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.is_starting">
<span class="sig-name descname"><span class="pre">is_starting</span></span><a class="headerlink" href="#django_q.Cluster.is_starting" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>Bool. Indicating that the cluster is busy starting up</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.is_running">
<span class="sig-name descname"><span class="pre">is_running</span></span><a class="headerlink" href="#django_q.Cluster.is_running" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>Bool. Tells you if the cluster is up and running.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.is_stopping">
<span class="sig-name descname"><span class="pre">is_stopping</span></span><a class="headerlink" href="#django_q.Cluster.is_stopping" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>Bool. Shows that the stop procedure has been started.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="django_q.Cluster.has_stopped">
<span class="sig-name descname"><span class="pre">has_stopped</span></span><a class="headerlink" href="#django_q.Cluster.has_stopped" title="Link to this definition"></a></dt>
<dd></dd></dl>
<p>Bool. Tells you if the cluster has finished the stop procedure</p>
</dd></dl>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="schedules.html" class="btn btn-neutral float-left" title="Schedules" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="monitor.html" class="btn btn-neutral float-right" title="Monitor" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>© Copyright 2015-2023, Ilan Steemers - 2022, Stan Triepels.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>