Межсервисный обмен сообщениями / шина для витых - PullRequest
2 голосов
/ 09 августа 2011

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

    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)

Используется как

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")

Это действительно простой пример, поскольку основной вариант использования - это использование общего в хранилище данных памяти. Сначала я пытался использовать синглтон, но столкнулся с слишком большим количеством проблем, пытаясь покрыть его юнит-тестами. Затем я попытался передать ссылку на хранилище данных повсюду, но почувствовал, что связываю свое приложение до 100% -ной зависимости от того, что хранилище данных никогда не меняется.

Мое единственное беспокойство в связи с идеей data.bus заключается в том, что это просто чрезмерно прославленная глобальная переменная. Итак, мой вопрос, есть ли какая-то служебная шина или система обмена сообщениями внутри витой, чтобы позволить передавать произвольные сообщения между различными ресурсами внутри витой прикладной программы, или моя идея data.bus так же хороша, как и решение?

1 Ответ

1 голос
/ 10 августа 2011

звучит так, как будто вы хотите «доску» или «пространство кортежей» для python (я не вижу, как витые вещи меняют вещи?)?если так, вот один - http://pypi.python.org/pypi/linda/0.5.1

...