Limits provide simple load management by limiting the number of tasks
submitted by a specific ecflow_server
We have learnt from experience that suite designers were using trigger‘s in
two different ways: as data dependency triggers and as courtesy triggers.
Triggers where designed for the former. The latter are used to prevent too
many jobs running at once and are actually an artificial way of queuing jobs.
Because ecFlow does not distinguish between the two sorts of triggers, suites can become
difficult to maintain after a while. So the concept of limit was introduced.
Limits are declared with the limit keyword
inlimit
Limits are used in conjunction with inlimit keyword.
First, a limit must be defined using the ‘limit NAME N’.
The limit definition is typically placed at the suite scope.
Next we create a group of tasks to which we want to apply the limit.
This is done by attaching an ‘inlimit NAME’ attribute to the nodes.
Attaching the attribute to a task adds the task to the group.
The effect of a limit is that no more than N tasks
of a group will run at once.
A node can be limited by several limits.
Ecf script
We will create family f5 with nine tasks.
Create new ecf script s in $HOME/course/test/f5/ directory, each one containing:
t1.ecf,t2.ecf.....t9.ecf
%include <head.h> echo "I will now sleep for %SLEEP% seconds" sleep %SLEEP% %include <tail.h>
Text
Let us modify our suite definition file:
# 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
Python
#!/usr/bin/env python2.7
import os
import ecflow
def create_family_f5() :
f5 = ecflow.Family("f5")
f5.add_inlimit("l1")
f5.add_variable("SLEEP", 20)
for i in range(1, 10):
f5.add_task( "t" + str(i) )
return f5
print "Creating suite definition"
defs = ecflow.Defs()
suite = defs.add_suite("test")
suite.add_variable("ECF_INCLUDE", os.path.join(os.getenv("HOME"), "course"))
suite.add_variable("ECF_HOME", os.path.join(os.getenv("HOME"), "course"))
suite.add_limit("l1", 2)
suite.add_family( create_family_f5() )
print defs
print "Checking job creation: .ecf -> .job0"
print defs.check_job_creation()
print "Check in limit references"
print defs.check()
print "Saving definition to file 'test.def'"
defs.save_as_defs("test.def")