2014-10-29 68 views
0

我已經創建了一個Scala過程,我讀到這是阻止,它應該包裹在scala.concurrent.blocking中嗎?我很困惑,因爲進程將回調到這裏的日誌參數,這將需要這個線程做我猜想的東西,所以它不完全阻塞?一個Scala過程應該在Scala Future中標記爲scala.concurrent.blocking嗎?

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) 
    } 
} 

回答

0

假設你正在返回的不是Future,你的代碼必須被阻塞的地方(我不明白你的例子是如何「一階的將來」) - 如果你調用調用一個函數一個回調,但然後阻止等待該回調被調用,你仍然阻塞。所以是的,宣佈它阻止。

+0

對不起,我暗示它的全部內容都在未來版本中,在這裏我已經更改了代碼以明確說明。 – Phil 2014-10-29 12:48:13

2

Scala進程實際上是由run函數執行的,該函數返回Process並且無阻塞地擴展它。 '!'是調用'run'函數並調用Process的exitValue()函數的函數。在「exitValue()阻塞,直到proccess退出)
調用Process(command).!(log)實際上是相同run(log).exitValue()(當然,不完全是,但你可以得到的想法......看到ProcessBuilderImpl.scala
如果你不想被封鎖剛剛打電話給我們運行功能。

相關問題