Tôi đang tìm cách thay thế rất nhiều perl của mình bằng scala. Một trong những điều tôi có xu hướng làm rất nhiều là gọi các tệp nhị phân (thường được biên dịch C++, nhưng có thể là java, các kịch bản perl khác, tập lệnh q, v.v) do các nhóm khác tại công ty của tôi cung cấp cho tôi.Scala - nhận được cuộc gọi lại khi quá trình bên ngoài thoát
Ví dụ, để thực hiện một số phép toán phức tạp, tôi sẽ bắt đầu một trong các tệp nhị phân nước ngoài, sau đó nhập đầu vào của tôi vào nó. Sau đó tôi sẽ nghe luồng stdout
của mình để có kết quả và luồng stderr
cho các thông báo chẩn đoán. Trong perl, tôi sẽ làm điều này bằng cách sử dụng một widget POE::Wheel::Run
. Tôi đã nghĩ ra điều gì đó tương tự (và đẹp hơn nhiều) trong scala, nhưng tôi muốn làm cho nó trở nên mạnh mẽ hơn. Đó là một wrapper nhỏ xung quanh một đối tượng ProcessIO
. Nó trông giống như thế này:
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
}
}
Sau đó tôi muốn sử dụng nó như thế này:
val exe = new Exe("tr [a-z] [A-Z]",
out => println("o: " + out),
err => println("e: " + err))
exe.write("lower")
exe.close()
nào in ra:
o: LOWER
này được tôi 90% đó, nhưng điều gì sẽ tốt đẹp sẽ là để có được một cuộc gọi lại khi quá trình thoát. Nó có thể thoát vì tôi đã đóng luồng đầu vào và vòng lặp nội bộ của nó dừng lại, nó có thể tự thoát ra, hoặc nó có thể thoát ra vì tôi đã giết nó. Trong cuộc gọi lại, nó sẽ là tốt để biết lý do tại sao nó dừng lại, và mã thoát.
Tôi có chút mất mát về cách thực hiện việc này, bất kỳ trợ giúp nào cũng sẽ được đánh giá cao (và mọi chỉnh sửa đối với mã ở trên đều được chào đón - tôi là một chút noob) .
Tôi đang sử dụng 2.9.0.1
Cá nhân, tôi nghĩ rằng nó hút rằng 'Process' không có một số loại phương pháp bỏ phiếu' isFinished'. Đó là một điều tôi thay đổi, mặc dù giải pháp được cung cấp bởi didierd có vẻ giống như những gì bạn muốn. –