Актеры Scala как однопоточные очереди - PullRequest
2 голосов
/ 17 июня 2009

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

  1. ChangeApplicationActor
  2. CacheActor

Как часть ChangeApplicationActor, когда я применяю изменение к некоторому объекту X во внешней системе, я хочу отправить событие, чтобы сообщить CacheActor о синхронизации:

val changeApplicationActor = actor { 
  loop {
    react {
      case ChangeInstruction(x) => 
        externalSystem.applyChange(x)
        cacheActor ! Sync(x)
    }
  }
}

Но у меня теперь есть два требования:

  1. У CacheActor есть внутреннее состояние, и в идеале я бы хотел, чтобы он обрабатывал Sync инструкций последовательно
  2. Если я получу входящую почту CacheActor, содержащую две Sync(x) инструкции для одного и того же значения x, тогда я хотел бы проигнорировать второе (т.е. у меня должен быть только один ожидающий * 1027) * инструкция для любого заданного значения x)

Есть ли способ заставить актера быть однопоточным? Есть ли способ получить доступ к почтовому ящику актера и удалить дубликаты событий? Могу ли я не избежать реализации CacheActor, так как не Actor ?

1 Ответ

5 голосов
/ 17 июня 2009

Актер гарантированно выполняется только в одном потоке за раз, а сообщения в почтовом ящике актера располагаются в порядке FIFO, поэтому # 1 там.

2 сложнее, поскольку для него нет встроенной поддержки. У актера есть атрибут «почтовый ящик». Вы можете получить доступ к почтовому ящику напрямую, а не через получение или реагирование. Все, что вам нужно сделать, это вытащить вызов соответствующих сообщений синхронизации из почтового ящика, прежде чем вы закончите обработку сообщения. При этом необходимо выполнить синхронизацию на актере, чтобы другой поток не пытался добавить материал в почтовый ящик во время отправки сообщения.

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

...