一种简单的“无扭曲”事件驱动编程方法
Trellis的Python项目详细描述
(注意:从0.7a1开始,网格api增加了很多新特性, 有些旧的已经被弃用了。如果您是从旧版本升级 版本,请参见porting guide了解详细信息。)
无论是应用服务器还是桌面应用程序, 复杂系统是事件驱动的,这通常意味着回调。
不幸的是,显式回调管理是对事件驱动的编程 显式内存管理对于大多数其他类型的编程来说都是一种乏味的工作 麻烦和不必要的错误的重要来源。
例如,即使在单线程程序中,回调也可以创建race 条件,如果按意外顺序触发回调。如果一块 的代码可能会导致“在某个东西的中间”触发回调,这两种情况 代码和回调可能会混淆。
当然,这就是为什么大多数gui库和其他大型事件驱动系统 通常有一些方法可以暂时阻止回调的发生。 这允许您修复或解决回调顺序依赖项错误…在 甚至增加more冗长的回调管理的成本。但仍然没有 解决忘记取消回调的问题…或注册所需的回调 首先!
网格通过引入automatic回调来解决所有这些问题。 管理,与python进行自动内存管理的方式基本相同。 而不是担心订阅或“倾听”事件和管理 回调的顺序,就是编写规则来计算值。棚架 “看到”您的规则访问的值,从而知道可能需要什么规则 当某些内容发生变化时重新运行-这与电子表格的操作没有什么不同。
但更重要的是,它还确保回调不能在 代码是“在某物的中间”。规则采取的任何可能导致 要触发的新事件是自动延迟到所有适用的 规则有机会对正在进行的事件做出响应。而且,如果你 尝试访问尚未更新的规则的值,它是 动态自动更新,以便它反映 进步。
没有过时的数据。没有比赛条件。没有回拨管理。这就是 格子给你。
下面是一个非常简单的例子:
>>> from peak.events import trellis >>> class TempConverter(trellis.Component): ... F = trellis.maintain( ... lambda self: self.C * 1.8 + 32, ... initially = 32 ... ) ... C = trellis.maintain( ... lambda self: (self.F - 32)/1.8, ... initially = 0 ... ) ... @trellis.perform ... def show_values(self): ... print "Celsius......", self.C ... print "Fahrenheit...", self.F >>> tc = TempConverter(C=100) Celsius...... 100 Fahrenheit... 212.0 >>> tc.F = 32 Celsius...... 0.0 Fahrenheit... 32 >>> tc.C = -40 Celsius...... -40 Fahrenheit... -40.0
如您所见,如果其他属性发生更改,则每个属性都会更新,并且 show_values在依赖值更改时调用操作…但是 如果他们没有:
>>> tc.C = -40
由于该值没有更改,因此没有重新计算基于该值的规则。
现在,想象一下这一切,但是扩大到包括可以依赖于事物的规则 好像发生什么事已经有多久了…不管鼠标键是不是 点击了…一个套接字是可读的…还是一个扭曲的“延迟的” 对象已激发。具有跨函数的自动依赖项跟踪 调用,所以您甚至不需要know您的规则所依赖的值,让 只需要显式地在中编码任何依赖项!
想象一下无痛mvc,您只需编写上述规则来更新 具有应用程序值的gui小部件…反之亦然。
然后,你将有一个小小的开始,仅仅是一个瞥见…什么 棚架可以帮你。
其他Python库当然存在,它们试图做类似的事情; pycells和纤维素是两种。然而,只有格架能完全支撑 循环规则(如上面的温度转换示例)和内部脉冲 写入冲突检测。网格也为每个单元使用较少的内存 (rule/value对象),并提供了许多其他特性,如pycells或 纤维素缺乏。
网格包可以是downloaded from the Python Package Index或 使用Easy Install安装,它有相当数量的文档, 包括以下手册:
- Developer’s Guide and Tutorial
- Time, Event Loops, and Tasks <升i>Event-Driven Collections with the Trellis(0.7a2中的新功能)
- Software Transactional Memory (STM) And Observers
- Porting Code from Older Trellis Versions
发布0.7a2的亮点:
- 删除了0.7a1中不推荐使用的API
- 回滚现在发生在整个原子操作上,即使不止一个 recalc传递发生在原子操作中。
- 为发布/订阅操作添加了collections.Hub类型,类似于 pydispatcher,但以声明性、无回调和可扩展的方式。
- 各种错误修复程序
网格的问题、讨论和错误报告应指向 这是PEAK mailing list。