Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Luigi管道中释放“资源”_Python_Pipeline_Luigi - Fatal编程技术网

Python 在Luigi管道中释放“资源”

Python 在Luigi管道中释放“资源”,python,pipeline,luigi,Python,Pipeline,Luigi,我有一个Luigi管道,它由我成批运行的任务图组成。其中一些任务依赖于昂贵的资源(例如AWS EC2计算机集群或其他昂贵的资源) 我试图以智能的方式使用此资源,以便在运行任务之前获取它,并在所有任务完成后尽快释放它。一般来说,昂贵的资源是在管道开始时分配的,而依赖关系图的一半很可能会被释放 在Luigi中,是否有一种有效的方法对此进行建模,以实现资源的获取和释放 根据Aquire和Releaseluigi.Tasks对其进行建模并不是最优的,因为它给我的图表增加了很多复杂性和不必要的边。理想情况

我有一个Luigi管道,它由我成批运行的任务图组成。其中一些任务依赖于昂贵的资源(例如AWS EC2计算机集群或其他昂贵的资源)

我试图以智能的方式使用此
资源
,以便在运行任务之前获取它,并在所有任务完成后尽快释放它。一般来说,昂贵的资源是在管道开始时分配的,而依赖关系图的一半很可能会被释放

在Luigi中,是否有一种有效的方法对此进行建模,以实现资源的
获取
释放

根据
Aquire
Release
luigi.Task
s对其进行建模并不是最优的,因为它给我的图表增加了很多复杂性和不必要的边。理想情况下,
调度器
将检查其
状态
,当不再有
正在运行
挂起的
任务需要资源时,它可以
释放它


这是否已经存在,或者我必须自己将此功能添加到Luigi中?

Luigi支持资源的概念,这些资源将在任务计划和运行时占用,然后在TAK完成时释放。为什么您需要更高级的方法

从:

此部分可以包含任意键。其中每一项都指定调度器允许工作人员使用的全局资源量。计划程序将阻止使用指定资源运行的作业超过本节中的计数。假定未指定的资源具有限制1。具有2个配置单元资源和1个mysql资源的配置的示例资源部分:

在您的案例中,您可以通过使用aws:1来对此进行建模。该资源一次只使用一次。现在,如果您想要控制任务的调度方式,那么您可以尝试使用优先级

然后,您可以在任务中添加:

resources = {"aws": 1}
据我所知,无法直接获取资源,因为这是由任务执行控制的

更新了(来自评论):

例如,如果您想要执行某些事情(例如清理),您可能需要使用事件处理程序来执行

 @luigi.Task.event_handler(luigi.Event.FAILURE)
 def handler_failure(self, exception):
       # do cleanups

有关更多信息,请参阅全文

谢谢你的回答,@mfcabrera。我已经在管道中使用了Luigi资源的这个概念。然而,这仅在调度器在给定资源耗尽时不启动许多任务的情况下才有用。假设EC2一次只能处理1个Luigi任务,并且您有4个工人,那么这很有用。然而,它与实际资源(比如EC2)的实际获取和释放无关。在您的示例中,您将如何实现实际AWS资源(例如tasks StartCluster和StopCluster)的启动和停止,特别是在出现故障和禁用任务的情况下?具体地说,在我当前的管道中,StopCluster是DAG中的最后一个任务。因此,在DAG中间的任何故障和上游都会导致StCu簇不被调用,这意味着在错误的情况下,我不能释放EC2实例。@ AntonEvangelatov,您尝试过事件处理程序吗?我会更新答案。也许有帮助,还没有。不清楚每次失败后是否会触发此回调,或者最终在任务失败后是否会触发重试次数。目前,StopCluster被建模为所有可能失败的任务的包装器。如果我可以动态更新StopCluster的依赖项(例如,如果失败3次,则删除失败的任务),这可能会解决问题。
 @luigi.Task.event_handler(luigi.Event.FAILURE)
 def handler_failure(self, exception):
       # do cleanups