twisted笔记一:Deferred笔记(搬运)

twisted笔记一:Deferred笔记(搬运)

最近在研究twisted,但官方文档写的太简洁,网上信息太少,于是翻墙找到了一位大佬的博客,找到了一些信息。
转自:https://sites.google.com/site/mypynotes/twisted-1/deferred

Deferred的简单套路

从twisted的文档入手,将Deferred独立出来简单的说明作用与使用方法,这样更能快速对Deferred有深刻的了解。

一、学习资料

  1. 主要参考资料官方文档http://twistedmatrix.com/projects/core/documentation/howto/deferredindepth.html关联译文
    http://wiki.woodpecker.org.cn/moin/twistedTUT00?action=AttachFile&do=get&target=deferred_tutorial.html(此链接将会下载离线文档)
  2. 关联资源http://wiki.woodpecker.org.cn/ moin/TwistedTUT

二、Deferred的作用

Deferred的主要作用可以用一句话比较形象说明,“不要打电话给我,我会打给你的(Don’t Call Us, We’ll Call You) ”。相当于做好计划后,执行交给Deferred,完成后再找我,我可要到一边Happy去了。它会根据callback运行结果(正常、发生例外)从callback链表中选择执行已注册的相应的callback函数,从而实现事件方式来驱动程序。callback的运行不影响主程序的运行,Deferred.callback执行后马上返回。(这点有待在后面证明)

三、Deferred实例

from twisted.internet import defer d=defer.Deferred()实例化后就可以对Deferred进行操作。

四、callback链表

链表是用来放置callback函数,链表中的函数可以响应三类事件,正常结束、例外结束、任意(包括前面两者),它们分别用addCallback、addErrback、addBoth注册到链表中。也就是说函数正常结束返回调用addCallback注册的函数,发生例外则调用addErrback注册的函数,使用addBoth注册的函数无论返回什么结果都会被调用。

五、callback函数注册

除了上面提过的addCallback、addErrback、addBoth三个注册函数外,还有另外一个addCallbacks可以同时注册处理正常结束和例外结束的函数。

def deferredExample():
    d = defer.Deferred()
    d.addCallback(failAtHandlingResult)
    d.addCallbacks(yesDecision, noDecisionPassthru)
    d.addCallback(handleResult) # - A -
    d.addErrback(handleFailure)

上面代码中第4行的addCallbacks效果如同
d.addCallback(yesDecision)
d.addErrback(noDecisionPassthru)

另外,我们也可以将注册过程写成下面形式。
d=refer.Deferred().addCallback(failAtHandlingResult).addCallbacks(yesDecision, noDecisionPassthru).addCallback(handleResult).addErrback(handleFailure)

六、callback链执行顺序

Deferred的链表是按顺序从第一个注册函数开始直到最后一个函数。如果发生例外时,有多个例外处理函数,则会调用发生例外函数下面第一个例外处理函数。后面的例外处理函数将不会被调用,除非第一个例外处理函数将这个例外向下传递。

七、其它一些特性

Deferred实例中还有另外一些函数,如pause,unpause,setTimeout,timeoutCall,chainDeferred,这些将留作下一步的测试。
另外还没涉及到的是Deferred上一级的defer库中的函数及其它类的使用,从一些代码看来这些函数将会进一步有利于Deferred的应用,但这也有待后面的进上步学习。

八、总结

经过Deferred are beautiful一节学习,了解Deferred的使用方法及其事件响应机制。

传送门:
twisted笔记一:Deferred笔记(搬运)
twisted笔记二:twisted的那三板斧(转载)
twisted笔记三:當Deferred遇上Thread(转载)

当数据存在主次表时,当更新了次表数据后,主表数据在后台有更变时。可利用刷新主表当前行的方法重显主表数据。 /************************************************************ 函数名称: f_refresh_currentrow(adw) 功 能: 刷新DW当前行数据,不可刷新NO update or 带arguments的DW 参数说明: adw 目标DW 返 回 值: integer 成功返回1,失败返回-1 作 者: sean 创建时间: 2010年8月18日 ************************************************************/ string ls_dataobject string ls_keys[] //key Column Name string ls_dbname[] //key field Name string ls_coltype[] //field style string ls_tablenm //table name string ls_condition //sql Condition long ll_currentrow //Current Row numeric long ll_column //Column count integer i datawindow ldw datastore ldatastore ldw=adw if ldw.rowcount( )=0 then return -1 elseif trim(ldw.describe( "datawindow.table.arguments"))<>'?' then messagebox('','刷新数据窗口当前行失败!,数据窗口需要参数',exclamation!) return -1 else ll_currentrow=ldw.getrow( ) FOR ll_column = 1 TO long(ldw.object.datawindow.column.count)//key names If ldw.Describe("#"+string(ll_column)+".key") ='yes' Then i++ ls_keys[i]=ldw.Describe("#"+string(ll_column)+".name") ls_dbname[i]=ldw.Describe("#"+string(ll_column)+".dbname") ls_coltype[i]=ldw.Describe("#"+string(ll_column)+".coltype") End If NEXT if upperbound(ls_keys[])=0 then messagebox('','刷新数据窗口当前行失败!,没有主键',exclamation!) return -1 else ls_tablenm=left(ls_dbname[1],pos(ls_dbname[1],'.') -1) //table name for i=1 to upperbound(ls_keys[]) if pos('numb,deci,long,',LeftA(ls_coltype[i],4) +',')>0 then ls_condition+="and "+ls_dbname[i]+"="+string(f_getitem(ldw,ll_currentrow,ls_keys[i])) else ls_condition+="and "+ls_dbname[i]+"='"+string(f_getitem(ldw,ll_currentrow,ls_keys[i]))+"'" end if next ls_condition=mid(ls_condition,4) //sql Condition ldatastore=create datastore ldatastore.dataobject=ldw.dataobject ldatastore.settransobject( sqlca) if f_addwhere_retrieve(ldatastore,ls_condition)=1 then if ldatastore.rowcount( )=1 then ldw.object.data[ll_currentrow]=ldatastore.object.data[1] ldw.setitemstatus( ll_currentrow, 0, primary!, NotModified!) //if ldw.getrow( )<>ll_currentrow then ldw.scrolltorow( ll_currentrow) end if else messagebox('','刷新数据窗口当前行失败!,条件语法错误',exclamation!) return -1 end if destroy ldatastore end if end if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值