添加meter

meter 类似 event, 但不同于值为 bool 类型(on/off)的 event,meter 的值可以取一个范围内的整数。 其他任务会在 meter 达到某个特定值时被触发。类似 event,meter 有名字,一个 task 可以包含多个 meter。

Ecf脚本

创建新的 task(t5,t6,和t7),当 task t1 的 meter 达到特定值时被触发。 为了通知 ecflow_server, task 必须调用 ecflow_client --meter 命令。

t1.ecf

  1. %include <head.h>
  2. echo "I will now sleep for %SLEEP% seconds"
  3. sleep %SLEEP%
  4. n=1
  5. while [[ $n -le 100 ]] # Loop 100 times
  6. do
  7. sleep 1 # Wait a short time
  8. ecflow_client --meter=progress $n # Notify ecFlow
  9. (( n = $n + 1 ))
  10. done
  11. %include <tail.h>

Suite definition

在 suite definition 中添加 meter。

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. meter progress 1 100 90
  9. task t2
  10. trigger t1 eq complete
  11. event a
  12. event b
  13. task t3
  14. trigger t2:a
  15. task t4
  16. trigger t2 eq complete
  17. complete t2:b
  18. task t5
  19. trigger t1:progress ge 30
  20. task t6
  21. trigger t1:progress ge 60
  22. task t7
  23. trigger t1:progress ge 90
  24. endfamily
  25. endsuite

Python

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

任务

  1. 编辑 definition 文件或 python 脚本,添加上面的修改。
  2. 编辑 t1.ecf,调用 ecflow_client --meter
  3. 拷贝 t4.ecft5.ecft6.ecft7.ecf
  4. 替换 suite
  5. 查看 ecflow_ui

    添加 meter - 图1

  6. 在 meter progress 上右键点击,选择 Edit…

    添加 meter - 图2

  7. 修改 meter 的值,点击 Apply 图标。

添加 meter - 图3