#scala #garbage-collection #actor
#scala #сбор мусора #актер
Вопрос:
если я хочу реализовать http-сервер am.
я создаю нового актера по запросу. Таким образом, он может увеличиваться по мере обновления моего процессора.
но вызовет ли это проблемы с использованием памяти? говорят, что у актера какое-то странное поведение во время gc. код будет каким-то образом таким:
class Worker extends Actor {
def act = react {
case req : Request => perform(req);exit()
}
}
class HttpEventHandler{
def onConnect(conn) = {
new Worker ! createRequest(conn)
}
}
Редактировать: я провел тест по этому поводу, подробно проверьте мой тест http://jilen.iteye.com/blog/1231178
Ответ №1:
Пару лет назад у Lift возникли некоторые проблемы со встроенной библиотекой актеров Scala, что побудило их написать собственную библиотеку актеров. Я понятия не имею, есть ли у встроенных участников Scala те же проблемы, с которыми тогда столкнулось сообщество Lift. Вам придется провести собственное тестирование, чтобы выяснить это. (Или, может быть, кто-то с недавним опытом может подключиться).
Я рекомендую проверить библиотеку актеров Akka. В целом, я думаю, что это улучшение встроенной реализации Scala. У него даже есть spawn
функция, которая делает именно то, что вы здесь делаете (создание актера для обработки одного сообщения и смерти).
Редактировать:
В частности, ваш список кода, вероятно, приведет к утечке актеров, поскольку вы явно не exit()
указываете своих актеров, когда закончите с ними.
Редактировать 2:
Оказывается, у самой Scala есть spawn
функция (спасибо Стефану). Я не знаю, ведет ли он себя лучше, чем актеры Scala.
Комментарии:
1. у меня есть тест на spawn, который отлично работает без утечки памяти.
2. и встроенный актер scala все еще не работает. В моем тесте я перенес OutOfMemory.
3. @jilen На самом деле, ваш ООМ может быть вызван тем, что вы не вызываете
exit()
, когда закончите со своим актером.4. я вызвал выход, см. jilen.iteye.com/blog/1231178 он написан на китайском языке, но просто посмотрите на код и диаграмму
5. Scala также предоставляет метод spawn, который можно использовать таким же образом. См . scala-lang.org/api/current/scala/concurrent/ops $.html