Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何监视Python对象的更改并对其作出反应?_Python_Multithreading_Monitoring_Introspection - Fatal编程技术网

如何监视Python对象的更改并对其作出反应?

如何监视Python对象的更改并对其作出反应?,python,multithreading,monitoring,introspection,Python,Multithreading,Monitoring,Introspection,我正在构建一个Python应用程序,它与几个硬件子系统进行接口,每个硬件子系统都有自己的接口线程。子系统的设计非常独立,只向主应用程序提供高级数据。我刚刚发现一些子系统以复杂的方式交互,需要一个子系统的接口从接口到另一个子系统获取低级数据 数据在界面中很深,我不想为了共享这些数据而重构整个系统(主应用程序对此毫不关心) 我想做的是对需要监视的特定项(类属性、实例属性或简单变量)应用修饰符,每当该项的值被更新时,该修饰符将向侦听器或后台处理程序发送消息(事件+值)。监听器应该能够在消息上休眠,因此

我正在构建一个Python应用程序,它与几个硬件子系统进行接口,每个硬件子系统都有自己的接口线程。子系统的设计非常独立,只向主应用程序提供高级数据。我刚刚发现一些子系统以复杂的方式交互,需要一个子系统的接口从接口到另一个子系统获取低级数据

数据在界面中很深,我不想为了共享这些数据而重构整个系统(主应用程序对此毫不关心)

我想做的是对需要监视的特定项(类属性、实例属性或简单变量)应用修饰符,每当该项的值被更新时,该修饰符将向侦听器或后台处理程序发送消息(事件+值)。监听器应该能够在消息上休眠,因此它可以快速(实时)响应更改,但是如果监听器必须轮询数据,监听器接口还应该提供缓冲

我知道被监视的项目必须将其
\uuu setattr\uuuu()调用包装。我从这个()中得到了一些提示,但它并没有考虑倾听的方面

数据可以发送到管道或队列之类的地方,因此侦听器可以比编写器慢,并且不会错过任何更新

但是作者和听众如何联系呢?它们是独立的执行线程和不同的模块,因此可以为数据项分配一个全局唯一的字符串名称(例如,“hyperpleegrate”),该名称将作为装饰器的参数(侦听器也知道)。第一次尝试写入或读取(它们将是异步的)将导致创建管道或队列,写入端返回给写入方,读取端返回给读取器

我已经看过Python内省工具,但它们似乎是被动的,在更新数据项时不会生成触发器。分析工具增加了太多的开销

理想情况下,decorator的执行成本应该与简单的值复制操作一样低,但最坏的情况是可以容忍cpickle调用。将来应该可以使用不同的通信方法(列表、deque、队列、管道、UDP套接字、JSON等等)。但是,当编写器和读取器共享相同的内存空间时,零拷贝解决方案将是理想的

最重要的是,它应该跨平台工作,包括在Windows下。它必须是线程安全的。我怀疑它最终可能会变得有用,由单个侦听器以类似
select()
的方式监视多个项目

最简单的开始方式是什么?我愿意做繁重的工作来写这篇文章,但我需要一些重要的线索


我怀疑像这样的一定已经存在了,我只是没能对搜索神说正确的咒语。

显然,最简单的开始方法是放下一个无限的愿望清单,为单个类的单个属性写下任何具体的“有效”字。玩到你满意为止。之后进行概括和抽象。这些事情通常以一个令人麻木的复杂框架结束,除了作者之外,没有人理解这个框架,更不用说能够调试或扩展了。作者在休息两周后也会失去这些能力-祝你好运;-)我的第一种方法是创建一个模块,该模块使用一个全局模块来保存名称字典以及它们映射到的传输机制(目前是一个deque)。该模块提供两个功能:请求读取器(名称)和请求写入器(名称)。调用时,每个函数都将查找或创建相应的字典条目,并返回一个函数,该函数将根据需要推送传递的数据或弹出队列的顶部。目的是为共享的每个数据项创建一个deque。一旦成功,我将尝试在传统的文件句柄下实现一些东西。