用于任务执行和依赖性处理的Python框架

时间:2012-03-12 09:49:43

标签: python build build-process build-automation jobs

我需要一个允许我执行以下操作的框架:

  • 允许动态定义任务(我将读取外部配置文件并创建任务/作业;例如,task =生成外部命令)

  • 提供一种指定现有任务依赖关系的方法(例如任务B将在任务B完成后运行)

  • 如果执行顺序允许,则能够在多个进程中并行运行任务(即没有任务相互依赖性)

  • 允许任务依赖于某些外部事件(不知道如何描述这一点,但有些任务完成后会在一段时间后产生结果,比如后台运行的作业;我需要指定一些的任务依赖于这个后台工作完成的事件)

  • 撤消/回滚支持:如果一个任务失败,请尝试撤消以前执行过的所有内容(我不希望在任何框架中实现这一点,但我想这值得问一下......)< / p>

所以,显然,这看起来或多或少像一个构建系统,但我似乎无法找到能让我动态创建任务的东西,大多数事情我似乎已经将它们定义在“生成文件”。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

我一直在做更多的研究,我偶然发现doit提供了我需要的核心功能,而不是过度杀戮(不是说Celery不会解决这个问题,但这样做它对我的用例更好。)

答案 1 :(得分:1)

另一种选择是使用make。

  • 手动编写Makefile或让python脚本编写它
  • 使用有意义的中间输出文件阶段
  • 运行make,然后调出进程。这些进程将是一个python(build)脚本,其中包含参数,告诉它要处理哪些文件以及要执行的任务。
  • -j
  • 支持并行执行
  • 如果任务失败,它也会删除输出文件

这避免了一些python并行化问题(GIL,序列化)。 显然在* nix平台上只是直截了当。

答案 2 :(得分:0)

AFAIK,python中没有这样的框架,它完全按照你的描述。因此,您的选择包括自行构建或破解您的一些需求并使用现有工具对其进行建模。闻起来像celery

  • 你可能有一个芹菜任务,它读取一个配置文件,其中包含一些python函数&#39;源代码,然后使用eval或ast.literal_eval来执行它们。

  • Celery提供了一种定义子任务(任务之间的依赖关系)的方法,因此如果您了解自己的依赖关系,可以相应地对它们进行建模。

  • 如果您知道任务的执行顺序,则可以将它们路由到任意数量的工作机器。

  • 您可以定期轮询此后台作业的结果,然后开始依赖它的任务。

  • 撤消/回滚:这可能很棘手,取决于你要撤消的内容;结果如何?州?