Twisted 延迟调用
延迟(defer)是twisted框架中实现异步的编程体系,使程序设计可以采用事件驱动的机制
1、基本使用
defer可以看作一个管理回调函数的对象,可以向该对象添加需要的回调函数同时也可以指定该组函数何时被调用
from twisted.internet import reactor,defer
from twisted.python import failure
import sys
d = defer.Deferred() # 定义defer实例 #####################函数添加阶段 def printSquare(d): # 正常处理函数
print('square of %d id %d '% (d,d*d)) def processError(f):
print('error when process') d.addCallback(printSquare) # 添加正常处理回调函数
d.addErrback(processError) # 添加错误处理回调函数 ################defer调用阶段 if sys.argv[1] =='call_error':
f= failure.Failure(Exception('my exception'))
d.errback(f) # 调用错误处理函数
else:
d.callback(4) # 调用正常处理函数
注:一个defer对象在添加完成回调函数过程后,只能由callback或者errback调用一次,如果嗲用两次,将会抛出异常
一个defer对象可以被赋予多个正常或错误的回调函数,这样形成的函数链将会按顺序调用执行
from twisted.internet import reactor,defer
from twisted.python import failure
import sys
d = defer.Deferred() # 定义defer实例 #####################函数添加阶段 def printSquare(d): # 正常处理函数
print('square of %d id %d '% (d,d*d))
return d def processError(f):
print('error when process') def printTwice(d):
print('Twice of %d is %d'%(d,2*d))
return d d.addCallback(printSquare) # 添加正常处理回调函数
d.addErrback(processError) # 添加错误处理回调函数
d.addCallback(printTwice) # 添加第二个正常处理回调函数 ################defer调用阶段 d.callback(5)
2、defer对象详解
- addCallback(self,callback,*args,**kwargs)
回调函数中必须有参数(单个,多个,默认值),不能为空;回调函数被调用时,回调函数第一个参数是defer函数链中前一个正常处理函数的返回结果,其后的参数是 addCallback()时指定的args和kw参数
- addErrback(self,errback,*args,**kwargs)
和正常回调函数类似,当函数被调用时第一个参数是failure.Failure(Exception('my exception'))的实例,用于说明错误情况
- addBoth(self,callback,*args,**kwargs)
将同一个回调函数同时作为正常处理函数和错误处理函数添加到defer对象中
- chainDeferred(self,d)
Defer对象链接函数用于将另一个defer对象的处理函数和错误处理函数添加到本defer对象中,本函数具有单向性
D1 = defer.Deferred()
D2 = defer.Deferred() D1.chainDeferred(D2)
- callback(self,result)
调用正常处理函数连,result是传递给第一个正常处理回调函数的参数
- errback(self,fail=None)
调用错误处理函数链,fail是传递给第一个错误处理回调函数的参数
- pause(self)和unpause(self)
为Defer对象调用链的暂停和继续pause函数用于暂停一个defer对象中函数链的调用,直到unpause函数被调用后继续
3、defer回调函数链的调用流程

4、结合defer和reactor
将defer对象和reactor的延时调用机制结合在一起,就可以开发出功能强大的异步调用函数
from twisted.internet import reactor,defer
#####################函数添加阶段 def printSquare(d): # 正常处理函数
print('square of %d id %d '% (d,d*d))
return d def printTwice(d):
print('Twice of %d is %d'%(d,2*d))
return d def makeDefer():
d = defer.Deferred() # 定义defer实例
d.addCallback(printSquare) # 添加正常处理回调函数
d.addCallback(printTwice) # 添加第二个正常处理回调函数
reactor.callLater(2,d.callback,5) # 配置延时2秒调用 ################defer调用阶段
makeDefer()
reactor.run() #挂起运行
reactor.callLater(delay,callable,*args,**kwargs)
第一个参数为延迟时间,之后参数为被调用的函数名及其参数 利用callLater函数,可以实现定时退出twisted消息循环:
from twisted.internet import reactor,defer reactor.callLater(4,reactor.stop) # 运行4秒后调用reactor.stop
reactor.run()
print('程序退出')
Twisted 延迟调用的更多相关文章
- 【Unity3D】Invoke,InvokeRepeating ,Coroutine 延迟调用,周期性调用
Invoke和InvokeRepeating方法,可以实现延迟调用,和周期调用 第一个是执行一次,第二个是重复执行 void Invoke(string methodName, float time) ...
- 用NodeJs实现延迟调用,规避定时任务的闭包问题
很多人在用NodeJs的setTimeout(callback, delay[, arg][, ...])编写定时任务时,习惯上直接操作callback外部的对象object(闭包的特点).这样做有一 ...
- xcode UIImageView创建、图片加载、 音频文件播放、 延迟调用
代码创建 /** 创建UIImageView */ UIImageView * imageView=[[UIImageView alloc]init]; /** 设置尺寸位置 */ imageView ...
- 延迟调用或多次调用第三方的Web API服务
当我们调用第三方的Web API服务的时候,不一定每次都是成功的.这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务. Task的静态方法Delay允许我们延迟执行某个Task,此方 ...
- ios 延迟调用 && UIImageView && UILabel && UISegmentedControl && UISwitch && UISlider
// // ViewController.m // UI_Lesson3 // // Created by archerzz on 15/8/13. // Copyright (c) 2015 ...
- 17_defer(延迟调用)关键字的使用
1.defer是延迟调用关键字,只能在函数内部使用 2.总是在main函数结束前调用(和init用法相对) 3.如果有多个defer 遵循先进后出的原则 4.和匿名函数同时使用时,如果匿名函数带有参数 ...
- Go语言系列开发之延迟调用和作用域
Hello,各位小伙伴大家好,我是小栈君,最近一段时间我们将继续分享关于go语言基础系列,当然后期小栈君已经在筹划关于java.Python,数据分析.人工智能和大数据等相关系列文章.希望能和大家一起 ...
- defer 延迟调用
1. 延迟调用 defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个 xxx 函数的调用延迟到当前函数执行完后再执行. defer xxx() 这是一个很简单的例子,可以很快帮助 ...
- c++11实现l延迟调用(惰性求值)
惰性求值 惰性求值一般用于函数式编程语言中,在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在后面的某个时候求值. 可以利用c++11中的std::function, lam ...
随机推荐
- Unity3D 引擎基础 C# (数据结构入门) Unity3D 界面 UI(NGUI)(动画系统,导航系统)(委托与事件,常用设计模式)
Geomagic Sculpt 2016.2 Windows Software 11个月前 (01-17) 0评论 Geomagic Sculpt 触觉式三维设计 触碰您的设计使用三维工具做三维设计. ...
- [Luogu3345][ZJOI2015]幻想乡战略游戏
Luogu 题意: 动态维护带权重心. sol 这是一道写起来很舒服的动态点分治.(不像某些毒瘤题) 我们考虑,如果你选择的补给点不是当前的带权重心,那么带权重心就在补给点的一个子树中(你把补给点当做 ...
- [JSOI2004]平衡点
题面在这里 题意 ...见链接吧 sol 在此发一篇模拟退火的题解 不得不说luogu的数据真是太良心啦 一句话解释模拟退火:在一个慢慢缩小的范围内随机状态寻找最优解,当转移状态更优时直接接受,当当前 ...
- 《Master Bitcoin》学习笔记02——比特币的交易模型
比特币的交易模型 模型基本描述 前面一篇学习笔记01提到了一个交易模型(第三章的内容),在第五章中,除了对这个模型做个详细介绍之外,其实和我上一篇理解的交易模型差不多,一个交易包含输入与输出,比特币是 ...
- python中的小知识点
这里是一些小知识点的汇集,为的是以后查找的方便. 行与缩进: 物理行:实际看到的代码行数. 逻辑行:在意义上的函数(即解释器执行的行数) 如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 ...
- HTTP架构介绍(2) 缓存
web缓存是自动复制所请求数据并将其保存在本地存储中的设备. 通过这样做, 可以实现: 减少网络流量 消除网络瓶颈 防止服务器超载 减少长距离的响应延迟 因此, 您可以清楚地说, web 缓存可提高用 ...
- SpringMVC【参数绑定、数据回显、文件上传】
前言 本文主要讲解的知识点如下: 参数绑定 数据回显 文件上传 参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定.. ...
- 浏览器中直接是使用react系列包开发,非打包方式。
直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- Linux基础教程(一)——Linux系统简介
Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的,由于 ...
- IPFS和竞争对手们(二)
在上一篇<IPFS和竞争对手们(一)>的开头抱怨的IPFS的开发进度,今天才得知 MaidSafe 是从2006年起步的( )这进度也是醉了. 接上一篇,今天继续讲IPFS的竞争对手们 图 ...