0

在使用 Autobahn 和 WAMP 之前,我一直在使用子类化方法,但偶然发现了装饰器/函数方法,我真的更喜欢子类化。

然而。我有一个从外部硬件(通过回调)调用的函数,该函数需要在被调用时发布到 Crossbar.io 路由器。

这就是我这样做的方式,在调用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])

这种在组件加入连接后保持引用的方法感觉有点“奇怪”。对此有不同的方法吗?这可以通过其他方式完成。

如果不是这样的话,子类化和在该子类中包含所有应用程序依赖的代码感觉更“正确”(但是将我的应用程序的所有内容都保留在一个子类中也感觉很奇怪)。

4

2 回答 2

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])
于 2018-02-27T11:05:53.680 回答
0

您可以在此处采用多种方法,但最简单的 IMO 是使用 Crossbar 的 http 桥接器。因此,每当从您的硬件接收到事件回调时,您只需向 Crossbar 发出 http POST 请求,您的消息就会被传递

有关 http 桥的更多详细信息https://crossbar.io/docs/HTTP-Bridge-Publisher/

于 2018-03-28T21:02:55.963 回答