添加complete

有时希望在满足某条件时不运行某任务,条件可以用 event 标识。 例如, event t2:b 可能暗示 task t2 没有生成期待的结果,所以我们不需要运行 task t4.

这种情况下,可以使用 complete 表达式(complete expression), 与关键词 trigger 有类似的语法, 但在满足条件时将任务置为 complete 状态而不运行该任务。

ecflow_server 尝试启动一个 task 时, 会检查 trigger 和 complete 表达式。如果满足 complete 表达式,任务就会被设为 complete 状态。 检查时,complete 表达式优先于 trigger 表达式。

complete 可以用于 task 间、family 间或者两者混合,也可以与 trigger 联合使用。

Suite Definition

在 suite definition 中定义 complete。

Text

  1. # Definition of the suite test.
  2. suite test
  3. edit ECF_INCLUDE "$ECF_HOME" # replace '$ECF_HOME' with the path to your ECF_HOME directory
  4. edit ECF_HOME "$ECF_HOME"
  5. family f1
  6. edit SLEEP 20
  7. task t1
  8. task t2
  9. trigger t1 eq complete # task t2 will only start when task t1 is complete
  10. event a # task t2 will set an event a
  11. event b # task t2 will set an event b
  12. task t3
  13. trigger t2:a # task t3 will start when event a is set in task t2
  14. task t4
  15. trigger t2 eq complete # task t4 will start when task t2 is complete
  16. complete t2:b # task t4 will complete if event b is set in task t2
  17. endfamily
  18. endsuite

Python

  1. import os
  2. from pathlib import Path
  3. from ecflow import Defs, Suite, Task, Family, Edit, Trigger, Event, Complete
  4. def create_family_f1():
  5. return Family(
  6. "f1",
  7. Edit(SLEEP=20),
  8. Task("t1"),
  9. Task(
  10. "t2",
  11. Trigger("t1 == complete"),
  12. Event('a'),
  13. Event('b')),
  14. Task(
  15. "t3",
  16. Trigger("t2:a")),
  17. Task(
  18. "t4",
  19. Trigger("t2 == complete"),
  20. Complete("t2:b"))
  21. )
  22. print("Creating suite definition")
  23. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  24. defs = Defs(
  25. Suite('test',
  26. Edit(ECF_INCLUDE=home, ECF_HOME=home),
  27. create_family_f1()))
  28. print(defs)
  29. print("Checking job creation: .ecf -> .job0")
  30. print(defs.check_job_creation())
  31. print("Saving definition to file 'test.def'")
  32. defs.save_as_defs(str(Path(home, "test.def")))
  33. # To restore the definition from file 'test.def' we can use:
  34. # restored_defs = ecflow.Defs("test.def")

运行脚本:

  1. $python test.py
  2. Creating suite definition
  3. # 4.8.0
  4. suite test
  5. edit ECF_INCLUDE '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  6. edit ECF_HOME '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  7. family f1
  8. edit SLEEP '20'
  9. task t1
  10. task t2
  11. trigger t1 == complete
  12. event a
  13. event b
  14. task t3
  15. trigger t2:a
  16. task t4
  17. complete t2:b
  18. trigger t2 == complete
  19. endfamily
  20. endsuite
  21. Checking job creation: .ecf -> .job0
  22. Saving definition to file 'test.def'

添加 complete - 图1

任务

  1. 更新 test.deftest.py,为 t4 添加 complete 表达式
  2. 替换 suite
  3. 查看 ecflow_ui
  4. 查看 t4 的触发器
  5. 注意表示 task 未运行的图标

添加 complete - 图2

  1. 可以修改 task t2,检查事件未激活时 task t4 是否运行。注释 t2 脚本中 event b 的语句。

添加 complete - 图3