Scala – 外部进程退出时获取回调
发布时间:2020-12-16 21:33:32 所属栏目:安全 来源:网络整理
导读:我正在寻找用 Scala替换很多我的perl.我倾向于做的很多事情之一是调用二进制文件(通常编译C,但可以是java,其他perl脚本,q脚本等),由我公司的其他团队提供给我. 例如,要做一些复杂的数学,我会启动一个外来的二进制文件,然后管道我的输入.然后,我会听取其stdou
我正在寻找用
Scala替换很多我的perl.我倾向于做的很多事情之一是调用二进制文件(通常编译C,但可以是java,其他perl脚本,q脚本等),由我公司的其他团队提供给我.
例如,要做一些复杂的数学,我会启动一个外来的二进制文件,然后管道我的输入.然后,我会听取其stdout流的结果,以及stderr流诊断消息.在perl中,我会使用POE :: Wheel :: Run小部件来做到这一点.我在scala中提出了类似的东西(而且更好),但是我想让它变得更加健壮.它是一个围绕ProcessIO对象的一个??封装.看起来像这样: class Exe(command: String,out: String => Unit,err: String => Unit) { import scala.sys.process._ import scala.io._ import java.io._ import scala.concurrent._ val inputStream = new SyncVar[OutputStream]; val process = Process(command).run( new ProcessIO( stdin => inputStream.put(stdin),stdout => Source.fromInputStream(stdout).getLines.foreach(out),stderr => Source.fromInputStream(stderr).getLines.foreach(err))); def write(s: String): Unit = synchronized { inputStream.get.write((s + "n").getBytes) } def close(): Unit = { inputStream.get.close } } 我会这样使用它: val exe = new Exe("tr [a-z] [A-Z]",out => println("o: " + out),err => println("e: " + err)) exe.write("lower") exe.close() 哪个打印出来 o: LOWER 这让我有90%的,但是当进程退出时会得到一个回调是什么会是好的.它可能会退出,因为我已经关闭了输入流并且其内部循环停止,它可能会自行退出,或者可能会因为我已经杀死它而退出.在回调中,知道为什么停止,退出代码是很好的. 对于如何解决这个问题,我有点失落,任何帮助将不胜感激(当然,对上述代码的任何编辑都是受欢迎的 – 我有点noob). 我使用2.9.0.1 解决方法
您可以等待进程结束调用exitValue.你可以在一个单独的线程中执行,回调将发生.也许课程过程可能会被改变:
import scala.concurrent.ops.spawn implicit def ProcessWithCallback(p: Process) { def whenTerminatedDo(callback: Int => Unit) = spawn{ val exitValue = p.exitValue; callback(p) } } 你可以随便在Exe中使用它. 由JVM给出并由scala.sys.Process包装的Process类是非常可取的,它将很难阻止一个线程 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |