并发,如何创建有效的actor设置?

时间:2015-03-04 12:23:50

标签: scala concurrency akka

好吧所以我以前从未做过这样强烈的并发操作,这个算法的三个主要部分。

这一切都以大约1百万项的Vector开始。 每个项目分三个阶段进行处理。

任务1:发出HTTP请求,将接收的数据转换为大约50个条目的地图。 任务2:接收地图并进行一些计算,以根据地图中找到的信息生成类实例。 任务3:接收类并生成/添加到多个输出文件。

我最初是通过在64个线程中同时运行64K条目的任务1开始的(每个线程有1024个条目)。在for循环中生成线程。

这种方法效果很好而且相对较快,但我一直听说演员以及他们如何比基本的Java线程/线程池更好。我创造了一些演员等。但不知道从哪里开始。

基本上:  1.演员是实现这一特定任务的快速并发的正确方法。还是有另一种方式我应该去做。  2.你怎么知道有多少线程/参与者太多,特别是在任务一中,你怎么知道同时连接数的限制是什么(我在Mac上)。是否有一个金色的芸香?每个线程池有多少线程与多大?和演员等价?  3.是否有任何我能看到的以类似方式实现演员的代码?我看到的所有代码要么是让演员打印你好的世界,要么是超级复杂的东西。

3 个答案:

答案 0 :(得分:2)

1)演员是设计组件之间复杂交互的好选择,因为它们很像“现实生活”。您可以将它们视为发送彼此请求的不同人,模拟交互是非常自然的。但是,当您想要在应用程序中管理更改状态时,它们是最强大的,对您来说似乎并非如此。没有actor,你可以实现快速并发。由你决定。

2)如果您的操作都没有阻塞,则最佳规则是线程数量= CPU数量。如果您在编写输出文件时使用非阻塞HTTP客户端和NIO,那么您应该在IO上完全无阻塞,并且可以安全地将应用程序的线程数设置为计算机上的CPU数量。

3)关于http://akka.io的文件非常好而且全面。如果你不知道如何使用演员模型我会建议买一本书 - 不一定是关于Akka。

答案 1 :(得分:1)

1)听起来你的大多数步骤都不是有状态的,在这种情况下,演员添加并发症并没有真正的好处。如果您需要以可变的方式协调多个任务(例如,用于生成输出文件),那么演员很适合该片段。但HTTP提取应该只是调用一些非阻塞的HTTP库(例如,喷射客户端 - 实际上会使用“引擎盖下的演员”,但这种方式不会向你暴露有状态)。

2)使用阻塞线程,您几乎必须进行实验,看看有多少可以在不占用太多资源的情况下运行。担心远程系统可以处理多少个同时连接,而不是在你自己的机器上点击任何“连接限制”(你可能会达到文件描述符限制,但如果这样最好的做法就是增加它)。一旦你弄明白,拥有更多的线程就没有价值,而不是你想要的同时连接数。

正如其他人所说的那样,通过非阻塞的一切你可能只需要一些类似于CPU核心数的线程(我也听说过“2x CPU数量+ 1”,理由是这样可以确保每当CPU空闲时,它总是一个可用的线程。)

对于演员我不会担心太多。它们非常轻巧。

答案 2 :(得分:0)

如果你在Akka中确实没有任何超越,那么尝试从简单的事情开始,比如对你的代码进行一对一的actor-thread重写。这将更容易理解akka中的工作原理。

在开头一个旋转两个演员接收请求,一个用于写入输出文件。然后,当收到请求时,在请求接收方actor中创建一个actor,它将执行计算并将结果发送给写入actor。