如何在Scala中创建非阻塞方法?

时间:2009-09-04 12:54:31

标签: scala

在Scala中创建非阻塞方法的好方法是什么?我能想到的一种方法是创建一个线程/ actor,该方法只是向线程发送一条消息并返回。有没有更好的方法来创建非阻塞方法?

3 个答案:

答案 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中有各种选项。

话虽如此,从实际的角度来看,演员会给你足够接近非阻挡的东西,因为没有一个同步的操作可以完成大量的工作,所以演员很有可能满足你的需要。