在循环中排队执行 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 和已设置的任何工作节点上。