一种简单的“无扭曲”事件驱动编程方法

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安装,它有相当数量的文档, 包括以下手册:

发布0.7a2的亮点:

  • 删除了0.7a1中不推荐使用的API
  • 回滚现在发生在整个原子操作上,即使不止一个 recalc传递发生在原子操作中。
  • 为发布/订阅操作添加了collections.Hub类型,类似于 pydispatcher,但以声明性、无回调和可扩展的方式。
  • 各种错误修复程序

网格的问题、讨论和错误报告应指向 这是PEAK mailing list

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
SimpleDataFormat如何在Java中使用DateFormat解析月份完整格式字符串?   java如何使用JBPM引导规则创建规则流组?   java将SQL和应用程序服务器从Windows 2003迁移到Windows server 2012 R2   java游戏!Intellij IDEA中的2.0控制台无法工作   java如何获取线程内分配的变量值?   java Android翻译动画导致Clicklistener问题   当前平台不支持java桌面API   java删除hashmap条目的方法是什么   用Spring MVC提供Java模型的RDF表示?   JAVA未安装Java的计算机上的lang.UnsupportedClassVersionError   java SQLite从3个表中获取使用组合的对象列表   来自的TLS握手错误的java云数据流BQ输出挂起作业   java如何使用SPARQL进行排名?   java如何在Netbeans 7.1.2中设置${user}的值?   java如何删除括号内的字符串?