2011-08-09 4 views
2

tordu Y a-t-il un mécanisme à torsion pour transmettre un message à un autre dans le processus? J'ai écrit un bus prototype qui ressemble àMessagerie inter-service/bus pour

from collections import defaultdict 
    channels = defaultdict(list) 

    def registerSingle(name, callback): 
     """ 
      Similar to register but ensures only one callback is register to a channel 
      @todo change Exception to something more appropriate 

      :name str A reasonably coherent name for a callback channel 
      :callback callable Either a bound method or just a function 
     """ 
     global channels 
     if len(channels[name]) > 0: 
      raise Exception("Tried to register %s but already has %s registered" % (name, channels)) 
     channels[name].append(callback) 

    def register(name, callback): 
     """ 
      Binds a callback to a named channel 

      :name str A reasonably coherent name for a callback channel 
      :callback callable Either a bound method or just a function 
     """ 
     global channels 
     channels[name].append(callback) 


    def call(name, *args, **kwargs): 
     """ 
      Applies the provided arguments to any and all callbacks for a specified channel 

      :name str A reasonably coherent name for a callback channel 
     """ 
     for callback in channels[name]: 
      callback(*args, **kwargs) 

A utiliser comme

foo.py

from Application.data import bus 

def doSomething(fooArg): 
    print "Hello from Foo, you sent " , fooArg 

bus.register("foo.doSomething", doSomething) 

bar.py

from Application.data import bus 

bus.call("foo.doSomething", "A simple string") 

C'est un exemple très simple le cas d'utilisation principal est de partager un magasin de données mémoire commun. Au départ, j'ai essayé d'utiliser un singleton mais j'ai rencontré trop de problèmes en essayant de le couvrir avec des tests unitaires. J'ai alors essayé de passer une référence au magasin de données partout mais j'ai senti que je lissais mon application pour être 100% dépendant du magasin de données ne changeant jamais. Mon seul problème avec l'idée de data.bus est que c'est simplement une variable globale sur-glorifiée. Donc, ma question, y at-il une sorte de bus de service ou de système de messagerie à l'intérieur de torsadé pour permettre de passer des messages arbitraires entre différentes ressources à l'intérieur d'une application tordue ou mon idée est-elle aussi bonne que possible?

Répondre

1

il semble que vous voulez un "tableau noir" ou "tuple space" pour python (je ne vois pas comment tordu change les choses?)? Si oui, en voici une - http://pypi.python.org/pypi/linda/0.5.1

+0

Malheureusement, il semble qu'il y ait peut-être un problème de réseautage à l'Université de York. pip install 404 et la page d'accueil désignée est également manquante. – David

+0

J'ai trouvé une source alternative au code Google ici http://code.google.com/p/pylinda/ – David

+0

Je suis d'accord que Twisted ne devrait probablement pas changer quoi que ce soit ici, surtout si c'est pour la messagerie intra-processus. – Glyph

Questions connexes