网友对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 = ; ...
随机推荐
- 团队项目--站立会议 DAY3
小组名称:D&M 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 今天是站立会议的第三天 在前两次会议的基础上 组员们总结了自己在任务中的经验 个抒己论在会议中进行了一些讨论 并且对接下来的工 ...
- 多网卡的7种bond模式原理
多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...
- [游戏模版12] Win32 稳定定时
>_<:The last time,we learned how to use timer to make the picture run and change show,but some ...
- 空间插值文献阅读(Geostatistical approaches for incorporating elevation into the spatial interpolation of rainfall)
空间插值技术应用必读论文---P. Goovaerts, Geostatistical approaches for incorporating elevation into the spatial ...
- Objective-C与C style语言的简单类比
1. 关于Objc中函数调用类比 [_lblHelloWorld setHidden:![_lblHelloWorld isHidden]]; 类比为: _lblHelloWorld.setHidde ...
- atitit.表单验证 的dsl 本质跟 easyui ligerui比较
atitit.表单验证的dsl 本质跟 easyui ligerui比较 1. DSL 声明验证 1 2. 自定义规则 1 3. 正则表达式验证,可以扩展实现 2 4. 犯错误消息提示,generic ...
- Python面试题(二)
打印九九乘法表 思路:利用字符串的连接,梯形输出结果 >>> def st(num): ... l = [] ... for x in xrange(1, num + 1): ... ...
- 正在开发纯BS的可在线编辑内容的电子病历编辑器
在线电子病历编辑器功能预览,支持Firefox/Chrome/Opera/UC/IE/Safari.演示地址 http://www.dcwriter.cn:9090/ 在WINFORM.NET中的效果 ...
- Spring 4.3.2+quartz2.2.3单机、集群+websocket集群实现文本或图片推送、接收及显示
相关环境 Nginx,Spring4.x当前(要选择4.0+),tomcat8.x,Quartz 2.x集群 测试面页:http://sms.reyo.cn/socket.html 测试面页是文本和图 ...
- Socket原理与编程基础(转)
一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...