2010-11-04 2 views
1

Mon application finit par faire beaucoup de traitement en arrière-plan via Actors, en chargeant spécifiquement des instances de Mapper et en travaillant ensuite dessus. C'est très répétitif et j'aimerais mettre en cache certaines de ces recherches dans mon code Actor.Comment utiliser en toute sécurité les caches ThreadLocal dans Actors?

J'utiliserais typiquement un ThreadLocal pour ceci. Cependant, étant donné que l'initialisation du thread est gérée par le pool de threads Actor, il semble que le seul endroit à initialiser et effacer ensuite le ThreadLocal serait dans la fonction partielle de l'acteur qui reçoit les messages entrants.

Ce que je fais maintenant est de créer une autre méthode dans mon acteur, comme ceci:

override def aroundUpdates[T](fn: => T) : T = { 
    clientCache.init { 
    fn 
    } 
} 

Lorsque la méthode gère init la compensation ThreadLocal dans un bloc finally. Je n'aime pas cette approche car aroundUpdates n'existe que dans le but de mettre en place le cache et ça sent comme une odeur de code.

Y a-t-il une meilleure façon de procéder?

Répondre

5

Vous n'avez pas besoin d'utiliser du fil- habitants: au cours d'une seule réaction, vous sont en cours d'exécution dans un seul fil. Par conséquent, vous pouvez simplement utiliser un var normal. De plus, parce que vos réactions sont séquentielle et le sous-système de l'acteur gère la synchronisation pour vous, vous pourrait (Si vous voulez) accéder à l'état de différentes réactions:

def act = loop { 
    var state : String = null 

    def foo = state = "Hello" 
    def bar = { println(state + " World"); state = null } 
    def baz = println(state + " Oxbow") 
    react { 
    case MsgA => foo; bar 
    case MsgB => baz 
    } 

} 

enfilent Ainsi les habitants font absolument aucun sens de utilisez dans vos propres réactions!

+0

Merci pour la réponse. J'ai conclu que ma conception est trop compliquée (un groupe d'acteurs appelant des méthodes en dehors de leur champ de définition) et doit être nettoyée. – Collin

Questions connexes