什么是事件驱动的并发?

use*_*206 8 concurrency scala event-driven

我开始学习Scala和函数式编程.我正在读这本书!编程scala:解决Java虚拟机上的多核复杂性".在第一章我看到了事件驱动的并发和Actor模型这个词.在我继续阅读本书之前,我希望有一个关于事件驱动的并发或Actor模型的想法.

什么是事件驱动的并发性,它与Actor模型有什么关系?

the*_*eon 16

事件驱动的编程模型涉及注册在给定事件触发时要运行的代码.一个例子是,而不是调用从数据库返回一些数据的方法:

val user = db.getUser(1)
println(user.name)
Run Code Online (Sandbox Code Playgroud)

您可以在数据准备就绪时注册要运行的回调:

db.getUser(1, u => println(u.name))
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,没有发生并发; 当前线程将阻塞,直到db.getUser(1)从数据库返回数据.在第二个示例中,db.getUser将立即返回并继续执行程序中的下一个代码.与此同时,回调u => println(u.name)将在未来的某个时刻执行.

有些人更喜欢第二种方法,因为它并不意味着内存饥饿线程不必要地等待缓慢的I/O返回.

Actor模型是一个如何使用事件驱动的概念来帮助程序员轻松编写并发程序的示例.

从超高级别开始,Actors是定义一系列事件驱动的消息处理程序的对象,这些消息处理程序在Actor接收消息时被触发.在Akka中,Actor的每个实例都是单个Threaded,但是当许多这些Actors放在一起时,它们会创建一个具有并发性的系统.

例如,Actor A可以向Actor 发送消息B并且C并行发送消息.演员BC可以将消息发送回Actor A.Actor A会有消息处理程序来接收这些消息并按照需要运行.

要了解有关Actor模型的更多信息,我建议您阅读Akka文档.它的写得非常好:http://doc.akka.io/docs/akka/2.1.4/

关于事件驱动并发的网络上还有很多关于事件驱动并发的好文档,我们比我在这里写的要详细得多.http://berb.github.io/diploma-thesis/original/055_events.html