Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0
HTML
<div class="section" id="limits">
<span id="index-0"></span><span id="id1"></span>
<div class="line-block">
<div class="line">Limits provide simple load management by limiting the number of tasks</div>
<div class="line">submitted by a specific <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecflow-server"><em class="xref std std-term">ecflow_server</em></a></div>
</div>
<div class="line-block">
<div class="line">We have learnt from experience that suite designers were using <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-trigger"><em class="xref std std-term">trigger</em></a>&#8216;s in</div>
<div class="line">two different ways: as data dependency triggers and as courtesy triggers.</div>
<div class="line">The former are for what triggers where designed. The latter are used to prevent too</div>
<div class="line">many jobs running at once and are actually an artificial way of queueing jobs.</div>
</div>
<div class="line-block">
<div class="line">Because ecFlow does not distinguish between the two sorts of triggers, suites can become</div>
<div class="line">difficult to maintain after a while. So the concept of <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-limit"><em class="xref std std-term">limit</em></a> was introduced.</div>
<div class="line">Limits are declared with the <strong>limit</strong> keyword</div>
</div>
<div class="section" id="inlimit">
<span id="id2"></span><h2>inlimit<a class="headerlink" href="#inlimit" title="Permalink to this headline">¶</a></h2>
<div class="line-block">
<div class="line">Limits are used in conjunction with <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-inlimit"><em class="xref std std-term">inlimit</em></a> keyword.</div>
</div>
<div class="line-block">
<div class="line">First, a <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-limit"><em class="xref std std-term">limit</em></a> must be defined using the &#8216;limit NAME N&#8217;.</div>
<div class="line">The limit definition is typically placed at the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite"><em class="xref std std-term">suite</em></a> scope.</div>
</div>
<div class="line-block">
<div class="line">Next we create a group of tasks to which we want to apply the limit.</div>
<div class="line">This is done by attaching an &#8216;inlimit NAME&#8217; attribute to the nodes.</div>
<div class="line">Attaching the attribute to a <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-task"><em class="xref std std-term">task</em></a> adds the task to the group.</div>
<div class="line">Attaching it to a <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-family"><em class="xref std std-term">family</em></a> adds all tasks from that <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-family"><em class="xref std std-term">family</em></a>.</div>
</div>
<div class="line-block">
<div class="line">The effect of a <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-limit"><em class="xref std std-term">limit</em></a> is that no more than N tasks</div>
<div class="line">of a group will run at once.</div>
</div>
<div class="line-block">
<div class="line">A <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-node"><em class="xref std std-term">node</em></a> can be limited by several limits.</div>
</div>
</div>
<div class="section" id="ecf-script">
<h2>Ecf script<a class="headerlink" href="#ecf-script" title="Permalink to this headline">¶</a></h2>
<div class="line-block">
<div class="line">We will create <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-family"><em class="xref std std-term">family</em></a> f5 with nine tasks.</div>
<div class="line">Create new <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecf-script"><em class="xref std std-term">ecf script</em></a> s in <tt class="file docutils literal"><span class="pre">$HOME/course/test/f5/</span></tt> directory, each one containing:</div>
</div>
<div class="highlight-python"><pre>%include &lt;head.h&gt;
echo "I will now sleep for %SLEEP% seconds"
sleep %SLEEP%
%include &lt;tail.h&gt;</pre>
</div>
</div>
<div class="section" id="text">
<h2>Text<a class="headerlink" href="#text" title="Permalink to this headline">¶</a></h2>
<p>Let us modify our <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite-definition"><em class="xref std std-term">suite definition</em></a> file:</p>
<div class="highlight-python"><pre># Definition of the suite test.
suite test
 edit ECF_INCLUDE "$HOME/course"
 edit ECF_HOME    "$HOME/course"
 limit l1 2

 family f5
     inlimit l1
     edit SLEEP 20
     task t1
     task t2
     task t3
     task t4
     task t5
     task t6
     task t7
     task t8
     task t9
 endfamily
endsuite</pre>
</div>
</div>
<div class="section" id="python">
<h2>Python<a class="headerlink" href="#python" title="Permalink to this headline">¶</a></h2>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/env python2.7</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">ecflow</span>  
 
<span class="k">def</span> <span class="nf">create_family_f5</span><span class="p">()</span> <span class="p">:</span>
    <span class="n">f5</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Family</span><span class="p">(</span><span class="s">&quot;f5&quot;</span><span class="p">)</span>
    <span class="n">f5</span><span class="o">.</span><span class="n">add_inlimit</span><span class="p">(</span><span class="s">&quot;l1&quot;</span><span class="p">)</span>
    <span class="n">f5</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;SLEEP&quot;</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span>
        <span class="n">f5</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span> <span class="s">&quot;t&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="p">)</span>
    <span class="k">return</span> <span class="n">f5</span>
    
<span class="k">print</span> <span class="s">&quot;Creating suite definition&quot;</span>   
<span class="n">defs</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Defs</span><span class="p">()</span>
<span class="n">suite</span> <span class="o">=</span> <span class="n">defs</span><span class="o">.</span><span class="n">add_suite</span><span class="p">(</span><span class="s">&quot;test&quot;</span><span class="p">)</span>
<span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;ECF_INCLUDE&quot;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">&quot;HOME&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;/course&quot;</span><span class="p">)</span>
<span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;ECF_HOME&quot;</span><span class="p">,</span>    <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">&quot;HOME&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;/course&quot;</span><span class="p">)</span>

<span class="n">suite</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span><span class="s">&quot;l1&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">suite</span><span class="o">.</span><span class="n">add_family</span><span class="p">(</span> <span class="n">create_family_f5</span><span class="p">()</span> <span class="p">)</span>
<span class="k">print</span> <span class="n">defs</span>

<span class="k">print</span> <span class="s">&quot;Checking job creation: .ecf -&gt; .job0&quot;</span>   
<span class="k">print</span> <span class="n">defs</span><span class="o">.</span><span class="n">check_job_creation</span><span class="p">()</span>

<span class="k">print</span> <span class="s">&quot;Saving definition to file &#39;test.def&#39;&quot;</span>
<span class="n">defs</span><span class="o">.</span><span class="n">save_as_defs</span><span class="p">(</span><span class="s">&quot;test.def&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>What to do:</strong></p>
<ol class="arabic simple">
<li>Edit the changes</li>
<li>Replace the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite-definition"><em class="xref std std-term">suite definition</em></a></li>
<li>In <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecflowview"><em class="xref std std-term">ecflowview</em></a>, observe the triggers of the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-limit"><em class="xref std std-term">limit</em></a> <strong>l1</strong></li>
<li>Open the Info panel for <strong>l1</strong></li>
<li>Change the value of the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-limit"><em class="xref std std-term">limit</em></a></li>
<li>Open the Why? panel for one of the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-queued"><em class="xref std std-term">queued</em></a> tasks of <strong>/test/f5</strong></li>
</ol>
</div>
</div>