添加事件

有时,等待一个任务结束还不够。如果任务产生多个结果,另一个任务或许需要在第一个结果生成时就开始运行。

ecFlow 引入事件 event 概念。event 是任务运行时发送给 ecflow_server 的一个消息,每个任务可以设置多个事件。event 是 trigger 的一种。

Ecf Script

我们将创建新的 task(t3,t4),它们被 t2 发出的事件触发。 通过拷贝 t1 创建 t3 和 t4 的 ecf script。 为了通知 ecflow_server,task(下面示例中的 t2)必须调用 ecflow_client --event

t2.ecf

  1. %include <head.h>
  2. echo "I will now sleep for %SLEEP% seconds"
  3. sleep %SLEEP%
  4. ecflow_client --event a # Set the first event
  5. sleep %SLEEP% # Sleep a bit more
  6. ecflow_client --event b # Set the second event
  7. sleep %SLEEP% # A last nap...
  8. %include <tail.h>

Suite Definition

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
  10. event a
  11. event b
  12. task t3
  13. trigger t2:a
  14. task t4
  15. trigger t2:b
  16. endfamily
  17. endsuite

Python

  1. import os
  2. from pathlib import Path
  3. from ecflow import Defs, Suite, Task, Family, Edit, Trigger, Event
  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. Trigger("t2:b"))
  18. )
  19. print("Creating suite definition")
  20. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  21. defs = Defs(
  22. Suite('test',
  23. Edit(ECF_INCLUDE=home, ECF_HOME=home),
  24. create_family_f1()))
  25. print(defs)
  26. print("Checking job creation: .ecf -> .job0")
  27. print(defs.check_job_creation())
  28. print("Saving definition to file 'test.def'")
  29. defs.save_as_defs(str(Path(home, "test.def")))
  30. # To restore the definition from file 'test.def' we can use:
  31. # 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. trigger t2:b
  18. endfamily
  19. endsuite
  20. Checking job creation: .ecf -> .job0
  21. Saving definition to file 'test.def'

任务

  1. 更新 test.deftest.py
  2. 编辑 t2.ecf,添加 ecflow_client –event 调用
  3. 拷贝 t1.ecft3.ecft4.ecf
  4. 替换 suite
  5. 在 ecflow_ui 中观察任务

    添加事件 - 图1

  6. 查看 t3 的触发器

    添加事件 - 图2

  7. 查看 t2 的触发器

    添加事件 - 图3