C# 和 Scala 都采用了框架来简化异步/并行计算,但方式不同。最新的 C#(5.0,仍处于测试阶段)已经决定使用异步/等待框架(在后台使用连续传递,但以更易于使用的方式),而 Scala 则使用“参与者”的概念,并且最近采用了 Akka 中的 actors 实现并将其合并到基础库中。
这是一个需要考虑的任务:我们收到一系列执行各种操作的请求——例如从用户输入、对服务器的请求等。有些操作很快,但有些需要一段时间。对于慢的,我们希望异步执行操作(在另一个线程中)并在线程完成时处理它,同时仍然可以自由地处理新请求。
一个简单的同步循环可能是(伪代码):
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 来表达,更一般地说,这些方法的优点/缺点是什么?
最佳答案
请考虑我的部分回答:“旧的”Scala actors 已被 Akka actors 取代,Akka actors 远不止是一个简单的 async/await 库。
- Akka actor 是“消息处理程序”,它们被组织成一个层次结构,可以在一个或多个 JVM 上运行,甚至分布在网络中。
- 当您意识到您的异步处理需要参与者(稍后阅读为什么这不是强制必需的)时,Akka 让您并帮助您在故障处理、调度和路由方面实现最佳模式
- Akka 带有不同的传输层和其他奇特的即用型设施,例如显式有限状态机、数据流并发等。
- Akka自带Futures,更可能对应C# 5.0中的Async/Await框架
您可以在 Akka 网站或这篇文章中阅读有关 Akka future 的更多信息:
关于c# - C# 5.0 async/await vs. Akka actor vs. basic fork/join 的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599017/