加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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类是非常可取的,它将很难阻止一个线程

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读