C# 和 Scala 都采用了框架来简化异步/并行计算,但方式不同。最新的 C#(5.0,仍处于测试阶段)已决定使用 async/await 框架(在底层使用 continuation-passing,但以更易于使用的方式),而 Scala 则使用“actors”的概念,并且最近在 Akka 中实现了 actor 并将其合并到基础库中。
下面是一个需要考虑的任务:我们收到一系列请求来执行各种操作——例如,来自用户输入、对服务器的请求等。有些操作很快,但有些需要一段时间。对于较慢的,我们希望异步执行操作(在另一个线程中)并在线程完成时处理它,同时仍然可以自由处理新请求。
一个简单的同步循环可能是(伪代码):
while (1) {
val request = waitForAnything(user_request, server_request)
val result = do_request(request)
if (result needs to be sent back)
send_back_result(result)
}
在基本的 fork/join 框架中,您可能会执行以下操作(伪代码):
val threads: Set[Thread]
while (1) {
val request = waitForAnything(user_request, server_request, termination of thread)
if (request is thread_terminate) {
threads.delete(request.terminated_thread)
val result = request.thread_result
if (result needs to be sent back)
send_back_result(result)
} else if (request is slow) {
val thread = new Thread(() => do_request(request))
Threads.add(thread)
thread.start()
} else {
val result = do_request(request)
if (result needs to be sent back)
send_back_result(result)
}
}
使用 async/await 和使用 actor 会如何表达,更一般地说,这些方法的优点/缺点是什么?