跳转至

在循环中排队执行 ESE 任务

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/queuing-ese-tasks-in-a-loop

19955 文章评分:

3.0

在循环中排队执行 ESE 任务

匿名作者 2015年2月3日,星期二

在使用桌面版 ENVI 和 IDL 时,将需要多次重复执行的处理任务设置在批处理脚本中是非常有用的。最简单的方法是使用 IDL 的 for 循环,每次对一个文件进行处理。然而,对于运行 ENVI Services Engine (ESE) 的实例来说,最佳做法是对每个独立文件单独调用处理任务。这会使处理过程更加健壮,因为单个文件处理中的错误不会导致所有文件的处理都停止。但这就引出了一个问题——如何遍历每个需要处理的文件?

一种解决方案是使用 IDL 创建一个循环,遍历每个文件,然后启动所有需要执行的任务。这会建立一个等待执行的任务队列。具体做法是:首先像在批处理过程中一样,创建一个输入文件和输出文件的列表,然后逐个文件调用提交处理请求到 ESE 所需的 HTTP 地址。

这可以使用 IDL 内置的 HTTP 客户端——IDLNetURL 来实现。例如,如果要调用的 ESE 进程是一个名为 "apply_color_table" 的异步任务,那么启动该任务的完整 HTTP 调用将是:

http://(host):8181/ese/services/AsyncService/apply_color_table/submitJob?inFile=file&outputFile=file

其中,(host) 是服务器的主机名或 IP 地址,关键字 "file" 是实际的输入和输出文件名。一种设置此调用以对多个文件执行的方法是使用如下代码,其中 inFiles 是一个包含所有待处理文件的变量。

oURL = Obj_New('IDLnetUrl')

oUrl.SetProperty, URL_SCHEME='http'

oUrl.SetProperty, URL_HOST = !SERVER.HOSTNAME

oUrl.SetProperty, URL_PORT='8181'

oUrl.SetProperty, $

URL_PATH='ese/services/AsyncService/apply_color_table/submitJob'

foreach inFile, inFiles do begin

oUrl.SetProperty, URL_QUERY='inputFile=' + inFile + $

'&outputFile=' + 'ct_' + inFile

result = oURL.Get()

json = JSON_Parse(result)

print, '状态文件: ' + json['jobStatusURL']

endforeach

被调用的任务将包含处理逻辑,在本例中,使用 IDL 直接调用时的代码会是:

apply_color_table, inputFile=inputFile, outputFile=outputFile

此过程将接收输入文件名和输出文件名作为参数,这些参数通过排队脚本传递。

一旦排队脚本完成,ESE 将开始依次运行这些任务,将工作负载分配到所有可用的 CPU 和已设置的任何工作节点上。

Landsat 8 的多种波段组合 Exelis 提供基于企业的分析能力以满足作战人员不断变化的需求