Сколько актеров можно запустить в Scala? - PullRequest
4 голосов
/ 01 мая 2011

Я попробовал этот код

import scala.actors.Actor

class MyActor(val id:Int) extends Actor {
    def act() {
        println (" ****************** starting actor: " + id)

        while (true) {
            Thread.sleep(1000);
            println ("I'm actor " + id)
        }
    }
}

object Main {
    def main(args:Array[String]) {
        val N = 5
        for (i leftArrow 1 to N) {
            val a = new MyActor(i)
            println (" ++++++++++ about to start actor " + a.id)
            a.start
        }

        println (N + " actors launched?")
    }
}

и получил этот вывод

++++++++++ about to start actor 1
 ++++++++++ about to start actor 2
 ++++++++++ about to start actor 3
 ++++++++++ about to start actor 4
 ++++++++++ about to start actor 5
5 actors launched?
 ****************** starting actor: 1
 ****************** starting actor: 4
 ****************** starting actor: 3
 ****************** starting actor: 2
I'm actor 4
I'm actor 3
I'm actor 1
I'm actor 2
I'm actor 4

Итак, чего мне не хватает, что на самом деле только четыре актера начинаются? Это зависит от моего компьютера? Некоторая конфигурация? Должен ли я начать актеры по-другому? Это потому, что я запускаю этот код внутри netbeans?

Большое спасибо!

Ответы [ 2 ]

8 голосов
/ 01 мая 2011

Я думаю, что это связано с пулом актеров в Scala. Вероятно (я все еще жду в своей книге «Актеры в Scala») создает пул с четырьмя потоками (возможно, связанный с вашим четырехъядерным процессором) и назначает им ваших актеров. Проблема в том, что вы используете Thread.sleep. Это обращается к определенному потоку и обходит актера scala для назначения потока.

6 голосов
/ 02 мая 2011

По сути, в Scala существует два вида акторов (при использовании стандартных акторов Scala 2.8): акторы на основе потоков и событий.

Когда вы используете receive (или receiveWithin),как в вашем примере, вы создаете актеров на основе потоков, которые являются относительно тяжелыми.Для каждого субъекта существует отдельный поток, который блокируется, пока субъект ожидает сообщения.

Когда вы используете react вместо receive, ваш субъект будет актером на основе событий.Актеры, основанные на событиях, намного легче;между акторами и потоками, основанными на событиях, нет прямой связи.Вы можете легко создать тысячи актеров на основе событий.

Я написал сообщение в блоге (и пример приложения) с более подробной информацией.

...