2015-06-13 41 views
1

所以,我有以下类型的代码在Spark上的每个地图任务中运行。请问Scala! subprocess命令等待子进程完成?

@volatile var res = (someProgram + fileName) ! 
var cmdRes = ("rm " + fileName) !; 

每个地图任务的文件名都是唯一的。基本思想是一旦第一个命令完成,第二个命令将删除该文件。但是,我注意到该程序有时会抱怨该文件不存在。看起来子进程调用不是同步的,也就是说,它不会等待子进程完成。那是对的吗。如果确实如此,我们该如何纠正?

回答

2

正如您在docs中看到的那样,!方法会阻塞,直到退出。该文档说:

启动由此构建器代表的进程,阻塞直到它退出并返回退出代码。

您可能应该检查退出代码来解释结果并处理特殊情况。

当通过串联创建过程的命令,你通常能够更好地使用Seq扩展(而不是在String的)来创建一个ProcessBuilderdocs甚至包括这个帮手,这可能会帮助你:

// This uses ! to get the exit code 
def fileExists(name: String) = Seq("test", "-f", name).! == 0 
+0

x。之间有任何区别!和x! – MetallicPriest

+1

没有区别,真的。在大多数情况下,这只是一种文体上的区别。爆炸'!'只是一种方法,你可以用空格或点来调用一个方法。您可以在Scala [here](http://docs.scala-lang.org/style/method-invocation.html)或[here](http://alvinalexander.com/scala)阅读更多关于方法调用和推荐样式的信息/阶的方法-点-空间单单参数) –