在使用Subclassing-Approach之前使用Autobahn和WAMP但是偶然发现了装饰器/函数方法,我更喜欢子类化。
然而。我有一个从外部硬件调用的函数(通过回调),这个函数需要在调用时发布到Crossbar.io Router。
我就是这样做的,在Session
被调用后立即引用on_join -> async def joined(session, details)
。
from autobahn.asyncio.component import Component
from autobahn.asyncio.component import run
global_session = None
comp = Component(
transports=u"ws://localhost:8080/ws",
realm=u"realm1",
)
def callback_from_hardware(msg):
if global_session is None:
return
global_session.publish(u'com.someapp.somechannel', msg)
@comp.on_join
async def joined(session, details):
global global_session
global_session = session
print("session ready")
if __name__ == "__main__":
run([comp])
这种在组件加入连接后保持引用的方法感觉有点“奇怪”。这有不同的方法吗?这可以通过其他方式完成。
如果不是因为对子类化感觉更加“正确”并且所有应用程序都依赖于该子类中的代码(但是将我的应用程序的所有内容保留在一个子类中也感觉很奇怪)。
答案 0 :(得分:0)
我建议使用异步队列而不是共享会话:
import asyncio
from autobahn.asyncio.component import Component
from autobahn.asyncio.component import run
queue = asyncio.queues.Queue()
comp = Component(
transports=u"ws://localhost:8080/ws",
realm=u"realm1",
)
def callback_from_hardware(msg):
queue.put_nowait((u'com.someapp.somechannel', msg,))
@comp.on_join
async def joined(session, details):
print("session ready")
while True:
topic, message, = await queue.get()
print("Publishing: topic: `%s`, message: `%s`" % (topic, message))
session.publish(topic, message)
if __name__ == "__main__":
callback_from_hardware("dassdasdasd")
run([comp])
答案 1 :(得分:0)
你可以采取多种方法,尽管最简单的IMO是使用Crossbar的http桥。因此,无论何时从您的硬件收到事件回调,您都可以向Crossbar发出http POST请求,并且您的消息将被传递
有关http bridge https://crossbar.io/docs/HTTP-Bridge-Publisher/
的更多详细信息