事實上Deferred的確就像是一連串的動作,用callback的形式被串在一起,我們用deferred或許可以這樣寫

d.addCallback(洗菜)
d.addCallback(切菜)
d.addCallback(放到鍋中)
d.addCallback(加鹽)

如果只是這樣看起來就像是單純的責任鍊,做完一件事情把結果往下丟,但是,如果發生例外呢?

def 切菜(data):
raise 切到手指('Ouch!')

如果只是單純的責任鍊,會從最初呼叫它的地方丟出來,如果只是一般的單thread程式這樣跑下來,其實加上一個try except就可以抓到了,但
是twisted是處理非同步的事件,所有事件都是由reactor.run()來驅動的,例外如果從run裡被丟出來,除了整個程序就停止了之外,我
們想去處理那些例外也就辦不到,因此它的error callback機制,目的就是在讓使用者也可以處理到錯誤

像這樣
d.addCallback(切菜)
d.addErrback(處理切菜錯誤)

除此之外他還有很多特異功能,有用平鋪直述的寫法所沒有的好處,我們這樣假設,炒菜是一件需要卡住整個線程執行三分鐘的事情,如果用直述的寫法

加鹽(ret)
炒菜(ret) # 我們會在這裡等三分鐘

這對於非同步的處理來說無疑的是一大致命傷,後面還一堆事件處理,卻有個笨蛋為了炒菜佔了大家三分鐘時間,在這三分鐘裡其它事件都沒辦法被處理,像這個
時候怎麼辦? 用Deferred的好處就來了

def _炒菜(data):
# 花三分鐘炒菜

def 炒菜(data):
return threads.deferredInThread(_炒菜) # api名稱我不確定 不過應該差不了多少

那對deferred的操作會像這樣

d.addCallback(加鹽)
d.addCallback(炒菜)
d.addCallback(上菜)

看到了沒有,很奇怪不是嗎? 我們的炒菜callback居然也回傳一個deferred物件,twisted到底會怎麼做? 把deferred物件
丟給上菜嗎? 答案是,twisted會等那個deferred物件callback,然後把回傳值丟給上菜,很奇妙不是嗎? 他會幫你把
deferred串接起來,因此deferred不是多此一舉的東西,而是帶來非同步程式非常大彈性的美麗設計,當你越瞭解deferred,你會覺得
這個設計真的很棒

以上

网友对twisted deferr的理解的更多相关文章

  1. twisted是python实现的基于事件驱动的异步网络通信构架。

    网:https://twistedmatrix.com/trac/ http://www.cnblogs.com/wy-wangyan/p/5252271.html What is Twisted? ...

  2. Android测试之Monkey

    自己用的测试 C:\Users\Star>adb shell monkey -p com.cmstop.android --monitor-native-crashes -- pct-touch ...

  3. Java 学习文章汇总

    目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技 ...

  4. HashMap负载因子

    下面是HashMap的一个构造函数,两个参数initialCapacity,loadFactor 这关系HashMap的迭代性能. /** * Constructs an empty <tt&g ...

  5. [原]Openstack之identity server(keystone)

    本博客已经添加"打赏"功能,"打赏"位置位于右边栏红色框中,感谢您赞助的咖啡. 重新温习keystone的概念和理解 --------------------- ...

  6. 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__

    关于call与apply的理解容易让人凌乱,这里有个方法可供参考 tiger.call(fox,arg1,arg2...) tiger.apply(fox,[arg1,arg2...]) 理解为 fo ...

  7. Storm中并行度原来是这样计算的(1.0.1版本)

    ==思考问题1== 向集群提交一个拓扑的时候,Storm是如何计算Task数以及Executor数的? 具体有多少个worker,多少个executor,每个executor负责多少个task? == ...

  8. 在我的职业生涯中,没有一种技能比 SQL 更有用!

    作者 | Craig Kerstiens 译者 | 阿拉丁 创业公司 CitusData(CitusData 是一家将 PostgreSQL 商业化的初创企业,也是 PostgreSQL 社区领导者, ...

  9. 关于 array of const

    之前应该参考一下: 关于开放数组参数 //这是在 System 单元定义的一组标识数据类型的常量: vtInteger    = ; vtBoolean    = ; vtChar      = ; ...

随机推荐

  1. 设计模式之美:Bridge(桥接)

    索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用 Bridge 模式分离抽象部分和实现部分. 别名 Handle Body 意图 将抽象部分与它的实现部分分离,使它们 ...

  2. 在Ubuntu下爽快开发Android必要的5款装备

    每一个程序员都有一颗极客的心,一些小装备肯定就比不可少啦.我刚刚从windows中转到Ubuntu,除了要适应ubuntu外,也想将windows中用惯了的小软件一起搬过去.在这里简单地罗列一下自己在 ...

  3. SQL关于日期的查询

    SQL查询某天的记录: datediff(day,[Datetime],'2012-08-03')=0 把Datetime换为你的相应字段: SQL查询今天的记录: datediff(day,[Dat ...

  4. ios 项目里常用的宏

    NSLog(@"__func__ :  %s", __func__);//oc测试环境,打印文件名,方法名 NSLog(@"__FUNCTION__ : %s" ...

  5. latex数字加粗后变宽

    latex的数字默认用的是Times New Roman字体,这个字体有个不优美之处就是加粗后会变宽,如下图所示: 平常倒是也无所谓.昨天在把实验数据整理进表格时,为了凸显每个数据集上各个实验方法的优 ...

  6. lucene字典实现原理

    http://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到该te ...

  7. Mybatis多参传递的四种解决方案

    Mybatis多参传递的四种解决方案 代码异常:org.apache.ibatis.binding.BindingException: Parameter 'param' not found. 长时间 ...

  8. PHP学习计划

  9. LPC4370 ACDHS speed and DMA

    LPC4370 ACDHS speed AHB clock BASE_M4_CLK CLK_M4_ADCHS up to 204 MHz. For register interface. ADCHS ...

  10. Swift - 计算文本高度

    Swift - 计算文本高度 效果 源码 // // String+StringHeight.swift // StringHeight // // Created by YouXianMing on ...