使用 IDL_IDLBridge 实现并行多进程处理
19303 文章评分:
5.0
使用 IDL_IDLBridge 实现并行多进程处理
作者匿名 2016年1月28日 星期四
我在新闻组注意到一个关于在并行进程中运行多个耗时IDL命令的问题。这是我们定制解决方案团队经常遇到的主题。以下是一个管理多个同时运行进程的简单示例。
请注意在代码中,通常需要为所有桥接进程控制工作目录和搜索路径,以便桥接进程能够找到必要的IDL代码以及所需的任何数据。
pro multi_process
compile_opt idl2, logical_predicate
cd, current=dir
n_proc = 10
tlb = widget_base(title='Initializing',/column, xsize=500, ysize=500)
t = widget_text(tlb, value='Initializing...')
widget_control, tlb, /realize
br = objarr(n_proc)
for i=0, n_proc-1 do begin
br[i] = IDL_IDLbridge()
br[i]->SetVar,'dir',dir
br[i]->Execute,'cd,dir'
br[i]->SetVar,'!path',!path
br[i]->Execute,'wait,50*randomu(seed)',/nowait
endfor
widget_control, tlb, /destroy
tlb = widget_base(title='Processing progress',/column)
t = widget_table(tlb, xsize=2, ysize=n_proc, value=strarr(2,n_proc), $
column_labels=['Process #','Status'], column_width=[250,250])
widget_control, tlb, /realize
; 监控进度
status = replicate(1, n_proc)
table = strarr(2,n_proc)
table[0,*] = strtrim(indgen(n_proc),2)
codes = ['Idle','Executing','Completed','Error','Aborted']
while max(status) gt 0 do begin
wait, 1
for i=0, n_proc-1 do begin
status[i] = br[i]->Status()
endfor
table[1,*] = codes[status]
widget_control, t, set_value=table
endwhile
widget_control, tlb, /destroy
end
此代码示例将显示一个简单的图形用户界面,展示IDL进程的状态。

如果您希望加速某些可在同一系统上单独运行的耗时IDL进程,这是一个极好的方法。在更复杂的情况下,您可能需要考虑使用ENVI Services Engine,因为它提供了更多配置“作业”运行方式的功能,并且支持在多个系统(节点)上分发作业。尽管这里使用了“ENVI”一词,但它同样支持运行纯IDL代码。