Scala, Актеры, что происходит с непрочитанными входящими сообщениями? - PullRequest
6 голосов
/ 02 сентября 2011

Что происходит с непрочитанными входящими сообщениями в Scala Actors ?Например два случая:1. Если вы забыли реализовать реагировать на специальные сообщения:actor!NoReactCaseMessage2. Если сообщения приходят слишком быстро:(timeOfProcessingMessage > timeOfMessageComes)Если произойдет первый или второй случай, будет ли он помещен в память?

РЕДАКТИРОВАТЬ 1 Существует ли какой-либо механизм, позволяющий увидеть, что происходит утечка памяти такого типа?Может быть, контролировать количество непрочитанных сообщений, а затем собирать мусор или увеличивать пул актеров.Как узнать количество непрочитанных сообщений?Как такого рода утечки памяти решаются на других языках?Например, в Erlang ?

Ответы [ 2 ]

8 голосов
/ 02 сентября 2011

Почтовый ящик является очередью - если ничто не вытягивает сообщения из очереди (т. Е. Если частичная функция в вашем цикле react или receive возвращает false для isDefinedAt), то сообщения просто остаются там,

Строго говоря, это утечка памяти (вашего приложения), хотя серьезность этого зависит от того, как число непрочитанных сообщений увеличивается (очевидно).Например, я часто использую актеров для слияния в запросе воспроизведения и «живом потоке» сообщений, идентифицированных по порядковому номеру.Моя реакция выглядит следующим образом:

var lastSeq = 0L
loop {
  react {
    case Msg(seq, data) if seq > lastSeq => lastSeq = seq; process(data)
  }
}

Это содержит утечку памяти, но не «серьезную», так как будет верхняя граница числа повторяющихся сообщений (то есть не может быть больше один раззапрос на воспроизведение завершен).

Однако это все еще может вызывать раздражение, поскольку для каждой реакции подсистема актора снова сканирует эти сообщения, чтобы выяснить, могут ли они быть обработаны.

На самом деле, хорошая мысль о реальном почтовом ящике может быть здесь.Представьте, что вы оставили там всю свою нежелательную почту: довольно скоро вы будете страдать голод из-за всей нежелательной почты, которую вам придется просеять, чтобы получить выписку по кредитной карте.

3 голосов
/ 04 сентября 2011

Как такого рода утечки памяти решаются на других языках? Например в Эрланге?

То же, что и в Scala. Первый выпуск:

  1. Если забыли реализовать ответный случай для специального сообщения

Вам очень редко нужно намеренно оставлять сообщение в почтовом ящике и получать его позже. Я никогда не сталкивался с такой ситуацией. Таким образом, вы всегда можете включить условие всеобъемлющего (case _ => ... в Scala), которое ничего не будет делать, записывать предупреждение или выдавать исключение - все, что наиболее целесообразно в вашей ситуации.

  1. Если сообщения приходят слишком быстро

Вместо отправки сообщений непосредственно процессу, который не может обработать их достаточно быстро, добавьте процесс буферизации. Он может выбрасывать лишние сообщения, отправлять их нескольким рабочим процессам и т. Д.

...