繁体   English   中英

在ZeroMQ / Tornado ioloop中使用BluetoothSocket,还是使用Twisted?

[英]Using a BluetoothSocket in ZeroMQ/Tornado ioloop, or maybe in Twisted?

我正在使用PyBluez通过蓝牙连接到设备。 它工作得很好。 设备正在使用SPP,我使用BluetoothSocket(RFCOMM)进行连接。

基本交互是:发送init命令 - >接收确认; 发送启动命令 - >接收连续数据; 发送停止命令 - > ...

我需要能够从另一个应用程序控制应用程序:启动,停止......我在想ZeroMQ或者可能是Tornado和HTTP / REST ifc。

我不是非常热衷于使这个多线程应用程序,因为我认为它有点过度杀死。 我已经在C#/ .NET中使用了很多线程和池,但是我预感到这里并不是必需的。 相反,我认为这将是非常混乱的。

但是,我需要能够通过ZeroMQ / REST / ...处理命令(例如“开始”,“停止”),同时继续接收数据并发送偶尔的数据包。

由于我是Python的新手,我不知道如何实现它。 我有一些想法:BluetoothSocket可以连接到ZeroMQ / Tornado IOLoop吗?

我假设我几乎可以使用Twisted完成任何事情,但我并不真正需要Twisted提供的所有功能。 如果我需要拉入Twisted,我会这样做。 我实际上找到了一个Twisted的BluetoothSocket 实现 但同样,我需要Twisted吗?

我尝试过使用Tornado IOLoop。 没有异常被抛出,但另一方面没有收到或发送数据:

def eventhandler(s, events, error = None):
    if events & ioloop.IOLoop.READ:
        print 'Socket read: %r' % s.recv(1024)
    elif events & ioloop.IOLoop.ERROR:
        print 'Socket error!'

events = ioloop.IOLoop.READ | ioloop.IOLoop.ERROR
self._loop.add_handler(self._socket.fileno(), eventhandler, events)

我现在真的不知道自己在做什么。 我最终会找到一种方法,但需要暗示要走哪条路。

广泛的Google-fu没有提供太多有用的信息,所以我现在在这里问。

编辑:我目前正在看“gevent”。 似乎比扭曲更简单。

你应该只使用Twisted。 你真正的问题似乎是关于Twisted的规模和资源利用率; 无论是在API复杂性,内存,磁盘上的包大小,部署麻烦,还是与您可能想要使用的其他库冲突,您是否会在应用程序中支付不合理的成本。

你不会。

  1. API复杂性:Twisted的API非常简单。 与某些FUD相反,您无需学习数以千计的API来有效地使用它:Twisted的核心具有非常精简的API,它具有多个离散层,并且每个层之间有许多明确记录的正式接口。 如果你知道你想知道什么(看起来像你这么做),只需一点指导就可以轻松拿起它。 此外,作为一个成熟的项目,社区中有很多人可以帮助您的用户加快速度。
  2. 内存使用:Twisted一直非常小心地管理其运行时依赖项,并且只导入它需要的内容。 加载反应堆将不会加载IMAP实现,因此只需导入您需要的内容,不要担心它。
  3. 包大小: Twisted是2兆字节 此外,如果你使用任何流行的UNIX-y操作系统(Linux,OS X,FreeBSD),你可能已经有了Twisted的操作系统包。 在许多发行版上,它甚至已经安装好了。
  4. 部署麻烦:如果您要担心任何问题,可以考虑这个问题,但与部署相关的问题实际上非常小。 “pip install Twisted”工作正常(现在, 只要你有一个C编译器 )。 Twisted 与py2exe ,py2app和Debian打包一起 工作 ,就像Python中的任何东西一样 真的,任何人都有任何问题是插件系统,对于许多应用程序,你可以忽略它。
  5. 图书馆冲突:你会完全没事。 Twisted不遗余力地兼容任何其他事件循环库所提出的每个hare-brained想法,无论是GUI还是事件循环。 你想使用ZMQ吗? 去吧。 龙卷风? 当然,无论如何 ; 整合是双向的。 龙卷风本身支持这种整合 想要使用Twisted中的阻塞库,但是你在主线程上并且你不想阻止? deferToThread让你满意 想要使用阻塞库中的Twisted函数,你需要阻止吗? 好的,只需从一个线程进行阻止调用

我希望这可以解决你对Twisted“矫枉过正”的任何误解。

这是一个没有直接体验的观点,但是我做了一些观察,你需要考虑的是阻塞与非阻塞IO。

从快速阅读开始,PyBluez模块(库)不支持异步IO,这意味着您最终需要深入挖掘库,以便在Tornado或Twisted中正确处理读写位。

如果这是我的项目,我可能会做的是将PyBluez库放入它自己的Thread中,然后有一些队列与之交互回龙卷风(我是龙卷风扇)。 现在只是如何将BlueTooth事件传递给主IOLoop的问题。 你真的有两个选择,将套接字连接到你自己,因为IOLoop通常在一个选择中被阻止。 或者设置一个定时器每100ms回调一次,以检查蓝牙队列上是否有任何应该处理的活动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM