网友对twisted deferr的理解
事實上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的理解的更多相关文章
- twisted是python实现的基于事件驱动的异步网络通信构架。
网:https://twistedmatrix.com/trac/ http://www.cnblogs.com/wy-wangyan/p/5252271.html What is Twisted? ...
- Android测试之Monkey
自己用的测试 C:\Users\Star>adb shell monkey -p com.cmstop.android --monitor-native-crashes -- pct-touch ...
- Java 学习文章汇总
目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技 ...
- HashMap负载因子
下面是HashMap的一个构造函数,两个参数initialCapacity,loadFactor 这关系HashMap的迭代性能. /** * Constructs an empty <tt&g ...
- [原]Openstack之identity server(keystone)
本博客已经添加"打赏"功能,"打赏"位置位于右边栏红色框中,感谢您赞助的咖啡. 重新温习keystone的概念和理解 --------------------- ...
- 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
关于call与apply的理解容易让人凌乱,这里有个方法可供参考 tiger.call(fox,arg1,arg2...) tiger.apply(fox,[arg1,arg2...]) 理解为 fo ...
- Storm中并行度原来是这样计算的(1.0.1版本)
==思考问题1== 向集群提交一个拓扑的时候,Storm是如何计算Task数以及Executor数的? 具体有多少个worker,多少个executor,每个executor负责多少个task? == ...
- 在我的职业生涯中,没有一种技能比 SQL 更有用!
作者 | Craig Kerstiens 译者 | 阿拉丁 创业公司 CitusData(CitusData 是一家将 PostgreSQL 商业化的初创企业,也是 PostgreSQL 社区领导者, ...
- 关于 array of const
之前应该参考一下: 关于开放数组参数 //这是在 System 单元定义的一组标识数据类型的常量: vtInteger = ; vtBoolean = ; vtChar = ; ...
随机推荐
- 设计模式之美:Bridge(桥接)
索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用 Bridge 模式分离抽象部分和实现部分. 别名 Handle Body 意图 将抽象部分与它的实现部分分离,使它们 ...
- 在Ubuntu下爽快开发Android必要的5款装备
每一个程序员都有一颗极客的心,一些小装备肯定就比不可少啦.我刚刚从windows中转到Ubuntu,除了要适应ubuntu外,也想将windows中用惯了的小软件一起搬过去.在这里简单地罗列一下自己在 ...
- SQL关于日期的查询
SQL查询某天的记录: datediff(day,[Datetime],'2012-08-03')=0 把Datetime换为你的相应字段: SQL查询今天的记录: datediff(day,[Dat ...
- ios 项目里常用的宏
NSLog(@"__func__ : %s", __func__);//oc测试环境,打印文件名,方法名 NSLog(@"__FUNCTION__ : %s" ...
- latex数字加粗后变宽
latex的数字默认用的是Times New Roman字体,这个字体有个不优美之处就是加粗后会变宽,如下图所示: 平常倒是也无所谓.昨天在把实验数据整理进表格时,为了凸显每个数据集上各个实验方法的优 ...
- lucene字典实现原理
http://www.cnblogs.com/LBSer/p/4119841.html 1 lucene字典 使用lucene进行查询不可避免都会使用到其提供的字典功能,即根据给定的term找到该te ...
- Mybatis多参传递的四种解决方案
Mybatis多参传递的四种解决方案 代码异常:org.apache.ibatis.binding.BindingException: Parameter 'param' not found. 长时间 ...
- PHP学习计划
- LPC4370 ACDHS speed and DMA
LPC4370 ACDHS speed AHB clock BASE_M4_CLK CLK_M4_ADCHS up to 204 MHz. For register interface. ADCHS ...
- Swift - 计算文本高度
Swift - 计算文本高度 效果 源码 // // String+StringHeight.swift // StringHeight // // Created by YouXianMing on ...