Scala进程是否应该在Scala未来中标记为Scala.concurrent.blocking?

Scala进程是否应该在Scala未来中标记为Scala.concurrent.blocking?,scala,akka,Scala,Akka,我已经创建了一个Scala进程,我读到这是阻塞,应该用Scala.concurrent.blocking包装它吗?我很困惑,因为进程将在这里调用log参数,这将需要这个线程执行一些我想是的事情,所以它不是完全阻塞的 import scala.sys.process.Process import scala.concurrent.Future import scala.sys.process.ProcessLogger def something = Future { val log = P

我已经创建了一个Scala进程,我读到这是阻塞,应该用Scala.concurrent.blocking包装它吗?我很困惑,因为进程将在这里调用log参数,这将需要这个线程执行一些我想是的事情,所以它不是完全阻塞的

import scala.sys.process.Process
import scala.concurrent.Future
import scala.sys.process.ProcessLogger

def something = Future {
  val log = ProcessLogger(normal => {
    lines = lines :+ normal
    Logger.info("SFTPline added: " + normal)
  },
  error => {
      Logger.info("SFTPERROR: " + error)
  })

  val success = scala.concurrent.blocking {
    val result = Process(command).!(log)

    lines.mkString("").contains("\"success\":true") && (result == 0)
  }
}

假设您返回的不是
未来
,那么您的代码一定在某个地方阻塞了(我看不出您的示例是如何“在scala未来中”)—如果您调用了一个调用回调的函数,但在等待调用该回调时阻塞了,那么您仍然在阻塞。因此,是的,声明它是阻塞的。

Scala进程实际上是由函数执行的,该函数在不阻塞的情况下返回并执行它。“!”是调用“run”函数,然后调用进程的exitValue()函数的函数。“exitValue()”会一直阻塞,直到进程退出)
正在调用
进程(命令)。!(log)
实际上与
run(log)相同。exitValue()
(嗯,不完全是这样,但你可以理解……请参见)

如果您不想被阻止,只需调用run函数即可。

对不起,我暗示这一切都将在未来发生,现在我已更改代码以明确这一点。