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