我正在构建一个与几个硬件子系统连接的Python应用程序,每个子系统都有自己的接口线程。设计是为了使子系统非常独立,只向主应用程序提供高级数据。我刚刚发现一些子系统以复杂的方式进行交互,这需要一个子系统的接口从接口到另一个子系统获得低级数据。
数据在界面深处,我不想重构整个系统只是为了共享这些数据(主要的应用程序可能不在乎它)。
我想要做的是将装饰器应用于需要监视的特定项(类属性,实例属性或简单变量),它们每当向侦听器或假脱机程序发送消息(事件+值)时项目的值已更新。侦听器应该能够在消息上休眠,因此它可以快速(实时)对更改做出反应,但是如果侦听器必须轮询数据,则侦听器接口也应该提供缓冲。
我知道被监控的项目必须包含__setattr__()
个调用。我从这里得到了一些提示(Decorating a class to monitor attribute changes),但它没有看到听力方面。
数据可能会发送到管道或队列之类的内容,因此侦听器可能比编写器慢,不会错过任何更新。
但是作家和听众将如何联系?它们是独立的执行线程和不同的模块,因此可以为数据项分配全局唯一的字符串名称(例如,“HyperBleegRate”),该名称将是装饰器的参数(并且也是侦听器已知的)。第一次尝试写入或读取(它们将是异步的)将导致创建管道或队列,其中写入端返回到写入器,读取端则返回到读取器。
我已经看过Python内省工具,但它们似乎是被动的,并且在更新数据项时不会生成触发器。分析工具增加了太多开销。
理想情况下,装饰器的执行成本应该与简单值复制操作一样低,但最坏的情况是可以容忍cpickle调用。将来应该可以使用不同的通信方法(列表,双端队列,队列,管道,UDP套接字,JSON,......)。但是当作者和读者共享相同的内存空间时,零拷贝解决方案将是理想的。
最重要的是,它应该跨平台工作,包括在Windows下。它必须是线程安全的。我怀疑单个监听器以select()
的方式监控几个项目最终会变得有用。
最简单的开始方式是什么?我愿意做这件事,但我需要一些重要的线索。
我怀疑像 必须 这样的东西已经存在,我只是没有向搜索神说出正确的魔术词。