在Scala中创建非阻塞方法的好方法是什么?我能想到的一种方法是创建一个线程/ actor,该方法只是向线程发送一条消息并返回。有没有更好的方法来创建非阻塞方法?
答案 0 :(得分:13)
使用scala.actors.Future:
import actors._
def asyncify[A, B](f: A => B): A => Future[B] = (a => Futures.future(f(a)))
// normally blocks when called
def sleepFor(seconds: Int) = {
Thread.sleep(seconds * 1000)
seconds
}
val asyncSleepFor = asyncify(sleepFor)
val future = asyncSleepFor(5) // now it does NOT block
println("waiting...") // prints "waiting..." rightaway
println("future returns %d".format(future())) // prints "future returns 5" after 5 seconds
带有多个参数的函数的重载“asyncify”留作练习。
但是,有一点需要注意的是异常处理。被“异步”的函数必须通过捕获它们来处理所有异常。抛出函数的异常行为未定义。答案 1 :(得分:2)
了解actors。
答案 2 :(得分:2)
这取决于您对“阻止”的定义。严格来说,任何需要获取锁定的东西都是封锁的。所有依赖于actor的内部状态的操作都会获取actor的锁定。这包括消息发送。如果有很多线程尝试一次性地向一个角色发送消息,他们必须排队。
因此,如果你真的需要非阻塞,java.util.concurrent中有各种选项。
话虽如此,从实际的角度来看,演员会给你足够接近非阻挡的东西,因为没有一个同步的操作可以完成大量的工作,所以演员很有可能满足你的需要。