【发布时间】:2009-06-17 14:26:00
【问题描述】:
作为in my own answer to my own question,我有一种情况,我正在处理大量到达队列的事件。每个事件都以完全相同的方式处理,甚至可以独立于所有其他事件进行处理。
我的程序利用了 Scala 并发框架,其中涉及的许多进程都被建模为Actors。由于Actors 按顺序处理他们的消息,因此它们不太适合这个特定问题(即使我的其他参与者正在执行顺序的操作)。因为我希望 Scala 能够“控制”所有线程创建(我认为这是它首先拥有并发系统的关键),所以我似乎有两个选择:
- 将事件发送到我控制的事件处理器池
- 让我的
Actor通过其他机制同时处理它们
我原以为#1 否定了使用actors 子系统的意义:我应该创建多少个处理器actor?这是一个显而易见的问题。据说这些东西对我来说是隐藏的,由子系统解决。
我的回答是:
val eventProcessor = actor {
loop {
react {
case MyEvent(x) =>
//I want to be able to handle multiple events at the same time
//create a new actor to handle it
actor {
//processing code here
process(x)
}
}
}
}
有没有更好的方法?这是不正确的吗?
编辑:一个可能更好的方法是:
val eventProcessor = actor {
loop {
react {
case MyEvent(x) =>
//Pass processing to the underlying ForkJoin framework
Scheduler.execute(process(e))
}
}
}
【问题讨论】:
-
虽然演员似乎不直接支持工人池,但这个 Q 有助于暴露这个缺陷。我可以使用的所有文档,请不要明确提及。
标签: scala concurrency actor