multithreading - 记录进程输出的 Groovy 方式

标签 multithreading asynchronous groovy io

我想在我的 Grails 应用程序中启动一个长时间运行的命令行进程,当它到达时将每一行输出记录到控制台,并异步执行其他操作,同时进程和日志记录事件继续进行。 (在某些时候,我想对每一行输出做一些其他的事情,比如记录到文件或查找某些值并触发其他操作。但就这个问题而言,记录到控制台是好的。)

下面是我想出的代码来做到这一点。它有效,但启动 logger没有明确终止的线程让我有点困扰 - 它会正确终止吗?它会变成僵尸吗?我宁愿告诉 Groovy 将进程输出直接发送到 System.out流 - 类似 command.execute(outputStream=System.out) - 但还没有找到一种非阻塞的方式来做到这一点。你能提出更好的方法吗?

def runCommand(command) {
    def process = command.execute()
    def out = process.getInputStream()
    def logger = Thread.start { out.eachLine { println it } }
    process.waitForOrKill(TIMEOUT_IN_MILLIS)
    return process // use to get exit code et cetera
}

最佳答案

看着Groovy docs for Process ,看到有一个方法consumeProcessOutput(OutputStream output, OutputStream error)。我尝试以下列方式重写您的方法,希望它是非阻塞的:

def runCommand(command) {
  def process = command.execute()
  process.consumeProcessOutput(System.out, System.err)
  println 'requested consume output' //hoping this will come out first
  process.waitForOrKill(TIMEOUT_IN_MILLIS)
  return process // use to get exit code et cetera
}

当我使用命令“dir”在 Windows XP 上运行它时,我得到以下输出:
requested consume output
file1    file2  ...

成功! :)

关于multithreading - 记录进程输出的 Groovy 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1342430/

相关文章:

c++ - 如何让一个 C++11 线程运行多个不同的函数?

C 读取器和写入器线程

java - 当线程池中没有空闲线程并且我们向池中提交任务时会发生什么?

ios - 如何在网络断开时停止 URLSessionTask?

c# - 使用事务的批量插入会阻止异步进程上的 UI

grails - GORM可以复制整个对象吗?

java - ElasticSearch Java API 异步编写

Java Akka 的 ActorRef 异步问题

grails - Canoo 和 Groovy - 如何使用 storeRegEx

java - 如何在 Java 或 Groovy 中找到下一个 Double?