C#和Scala都采用了框架来简化异步/并行计算,但方式不同。最新的C#(5.0,仍然处于测试阶段)决定使用async / await框架(使用延续传递,但使用方式更简单),而Scala则使用“actors”的概念,最近在Akka中采用了演员实现并将其合并到基础库中。
这是一项需要考虑的任务:我们收到一系列要求进行各种操作的请求 - 例如从用户输入,到服务器的请求等。有些操作很快,但有些操作需要一段时间。对于慢速的,我们想异步地执行操作(在另一个线程中)并在线程完成时处理它,同时仍然可以自由处理新请求。
简单的同步循环可能是(伪代码):
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来表达这些内容,更一般地说这些方法的优点/缺点是什么?
答案 0 :(得分:5)
请将我的视为部分答案:“旧的”Scala演员已被Akka演员取代,后者更像是一个简单的异步/等待库。
您可以在Akka网站或此帖子上阅读有关Akka期货的更多信息:
答案 1 :(得分:2)
我不能代表Scala,但C#版本看起来像这样(我没有IDE方便所以原谅任何错误/错别字:
public async Task<int> GetResult()
{
while (true)
{
var request = await waitForAnything(user_request, server_request);
var result = await do_request(request);
if (isValid(result))
return result;
}
}
你可以称之为:
public void RunTheProgram()
{
int result = await GetResult();
Console.WriteLine("Result: {0}", result);
}
简而言之,实际代码看起来非常像伪代码,即非常类似于普通人如何思考问题。这就是C#异步/等待的真正美。
答案 2 :(得分:2)
Scala还实现了async / await范例,它可以简化一些算法。