multithreading - 多线程方法与 Akka Actor 模型

标签 multithreading akka actor

我是 akka Actor 的新手。我已经阅读了 akka 官方文档,但仍然不明白 actor 与线程模型相比是如何工作的。

让我们举一个这样的简单例子。我有一个传统的 HttpServer,它在线程池中有 10 个线程。当同时有 20 个请求到来时,H​​ttpServer 将委托(delegate)线程池中的所有 10 个线程来处理前 10 个请求,其余的将在网络接口(interface)中排队等待线程拾取。

基于 actor 的 HttpServer 将如何应对同样的问题?是否所有请求都在委托(delegate)的参与者面前排队,以按顺序处理它们并将消息发送给其他参与者?如果是这样,这就是我不明白actor如何提供比线程模型更好的性能的一点,因为只有1个actor按顺序处理20个请求不能比10个线程同时处理20个请求快。

我想了解的是,当多个请求同时出现时, Actor 如何 react ? ,而不是actor如何处理和排队邮箱中的消息,它已经在文档中出现了很多。有人可以模拟此示例中 Actor 的工作步骤吗?

最佳答案

让我试着给出一个比较笼统的答案,我希望能在高层次上为你澄清一些事情。
HTTP 服务中有 10 个线程和 20 个请求,基于...
典型的线程模型
请求被分配给一个线程,直到请求得到满足。线程可能会阻塞,但不一定要释放以处理另一个请求。高性能的 http 服务器可以复制参与者模型中的行为类型(通过多个线程的基于消息的流),直到通常调用用户代码为止。
流/ Actor 模型
请求的消化通过参与者处理路由解析、处理请求和呈现响应来进行(例如,结果可能会有所不同)。在这个流程的各个点,可以分配一个线程来处理不同的请求。理论上,所有 20 个请求都可以通过 Actor 模型移动,尽管任何时候只有 10 个处于事件状态。
使用诸如 akka-http(基于 akka-streams,基于 akka-actors)之类的框架的一个好处是,用户代码可以作为流式元素参与整个流程,从而允许可能在线程模型中阻塞的操作利用非-阻塞 I/O,允许线程被释放到另一个请求等待解决的 I/O。例如,http 服务可以很好地充当 RESTful 客户端并与其他(可能是多个并行的,通过参与者)服务联系 - 线程将被释放以处理其他请求,等待对此类传出 HTTP 流量的响应。
概括
Actor 模型形式化了一组(可以说是最好的)围绕有效管理线程的实践。

关于multithreading - 多线程方法与 Akka Actor 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933990/

相关文章:

java - 为什么在 IDEA 中创建的默认 Play 应用程序在启动时崩溃,并将 Akka 2.3.3 声明为依赖项?

scala - 获取或创建子 Akka actor 并确保 liveness

event-handling - 我应该使用事件处理程序还是 Actor 来为游戏添加键盘控件

python - 如何在Python中使用队列处理线程中的异常?

java - Akka 身份验证设计(有限状态机)

c++ - 线程间实时数据共享

scala - 如何在不阻塞的情况下使用 Akka 询问模式

java - 如何记录来自 Akka (Java) 的所有传入消息

c - 比较和交换的工作原理

c# - 有没有办法强制异步/等待在第一个可用线程上继续?