WorkspaceRunner中多进程处理 如何判断所有进程是否结束
原文发布时间:2015-03-11
作者:一辉
WorkspaceRunner这个转换器想必不少朋友都用到过,它的作用是在一个工作空间中执行另外一个工作空间,当然这还不是关键,关键是他可以同时开7个fme.exe的线程,在我们的计算机硬件配置足够强大,内存cpu足够强大的时候能够大幅度的提升数据处理的效率。
关于该转换器的一般用法其他博客曾经提到过,这里就不做介绍了,本文主要介绍使用该转换器做多线程任务处理的时候,该如何判断所有进程是否结束。
并行处理参数设置
通过尝试我们发现WorkspaceRunner的三个输出端口里面,在上图参数设置为No的时候,三个端口的数据都会很快的通过,在这个转换器内部无法控制等到所有进程执行结束再进入下一个转换器,所以我们必须想其他的办法。
思路:通过Summary端口里面的_processes{}列表,在系统的进程列表里是否能够找到,如果能找到则证明未执行结束,如果找不到则证明已经执行结束,这里我们根据进程的PID来判断。
实现方法:当然不可能是通过人眼来看fme.exe的PID在任务管理器是否存在,这里我们通过一个PythonCaller的转换器通过python脚本来判断进程中fme.exe是否存在PID与_processes{}相同的要素。
下面把脚本贴出来:
import sys
reload(sys)
sys.setdefaultencoding('gbk')
import fmeobjects
from os import popen
from time import sleep
# Template Function interface:
def processFeature(feature):
pass
# Template Class Interface:
class FeatureProcessor(object):
def __init__(self):
self.l = fmeobjects.FMELogFile()
pass
def getPid(self,imagename):
cmd = 'tasklist /FI "IMAGENAME eq %s"'%imagename
pro = popen(cmd).read()
return pro
def input(self,feature):
_processes = feature.getAttribute('_processes')
j = 0
for i in _processes:
while i in self.getPid('fme.exe'):
sleep(1)
j += 1
self.l.logMessageString('held %d second'%j)
self.l.logMessageString('excute finished')
self.pyoutput(feature)
def close(self):
pass
这里的脚本语言我就不一一介绍了,大家如果用到是可以直接拷贝到pythoncaller里面的,后面写了写日志用来标示模板仍在执行,和执行的时间,脚本水平不高希望老鸟们不要见笑。