延迟(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 延迟调用的更多相关文章

  1. 【Unity3D】Invoke,InvokeRepeating ,Coroutine 延迟调用,周期性调用

    Invoke和InvokeRepeating方法,可以实现延迟调用,和周期调用 第一个是执行一次,第二个是重复执行 void Invoke(string methodName, float time) ...

  2. 用NodeJs实现延迟调用,规避定时任务的闭包问题

    很多人在用NodeJs的setTimeout(callback, delay[, arg][, ...])编写定时任务时,习惯上直接操作callback外部的对象object(闭包的特点).这样做有一 ...

  3. xcode UIImageView创建、图片加载、 音频文件播放、 延迟调用

    代码创建 /** 创建UIImageView */ UIImageView * imageView=[[UIImageView alloc]init]; /** 设置尺寸位置 */ imageView ...

  4. 延迟调用或多次调用第三方的Web API服务

    当我们调用第三方的Web API服务的时候,不一定每次都是成功的.这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务. Task的静态方法Delay允许我们延迟执行某个Task,此方 ...

  5. ios 延迟调用 && UIImageView && UILabel && UISegmentedControl && UISwitch && UISlider

    // //  ViewController.m //  UI_Lesson3 // //  Created by archerzz on 15/8/13. //  Copyright (c) 2015 ...

  6. 17_defer(延迟调用)关键字的使用

    1.defer是延迟调用关键字,只能在函数内部使用 2.总是在main函数结束前调用(和init用法相对) 3.如果有多个defer 遵循先进后出的原则 4.和匿名函数同时使用时,如果匿名函数带有参数 ...

  7. Go语言系列开发之延迟调用和作用域

    Hello,各位小伙伴大家好,我是小栈君,最近一段时间我们将继续分享关于go语言基础系列,当然后期小栈君已经在筹划关于java.Python,数据分析.人工智能和大数据等相关系列文章.希望能和大家一起 ...

  8. defer 延迟调用

    1. 延迟调用 defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个  xxx 函数的调用延迟到当前函数执行完后再执行. defer xxx()   这是一个很简单的例子,可以很快帮助 ...

  9. c++11实现l延迟调用(惰性求值)

    惰性求值 惰性求值一般用于函数式编程语言中,在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在后面的某个时候求值.     可以利用c++11中的std::function, lam ...

随机推荐

  1. 说出JQuery中常见的几种函数以及他们的含义是什么?

    jQuery中常见的函数如下:  (1)get()取得所有匹配的DOM元素集合. (2)get(index)取得其中一个匹配的元素.index表示取得第几个匹配的元素. (3)append(conte ...

  2. yyb要填的各种总结的坑

    已经写好啦的 莫比乌斯反演 杜教筛 动态点分治 斜率优化 Splay 莫队 凸包 旋转卡壳 Manacher算法 Trie树 AC自动机 高斯消元 KMP算法 SA后缀数组 SAM后缀自动机 回文树 ...

  3. 【BZOJ2190】仪仗队(数论)

    [BZOJ2190]仪仗队(数论) 题面 粘链接,题目中有图片 题解 对于题意,可以考虑 如果有\((i,j)\)能够被看见 那么,\((ki,kj)\)就一定不能看见 所以,如果一个点能够被看见,则 ...

  4. 【NOI2008】假面舞会(图论,搜索)

    题面 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一个自己喜欢的面 具.每个面具都有一个编号 ...

  5. 【HAOI2015】树上操作(树链剖分)

    题面 Description 有一棵点数为N的树,以点1为根,且树点有边权.然后有M个操作,分为三种: 操作1:把某个节点x的点权增加a. 操作2:把某个节点x为根的子树中所有点的点权都增加a. 操作 ...

  6. 环境变量配置为jdk8,显示的java版本为jdk7

    经查找发现是jdk版本的问题,我系统环境变量配置的是jdk7,可是这个war包需要在jdk8的环境下运行.于是我就手动将环境变量的jdk7换成jdk8,结果发现依然还是会出现以上问题.于是我打开cmd ...

  7. asp.net mvc 5 关闭xss过滤

    在控制器方法的头部添加        [ValidateInput(false)] 如果向mvc服务端提交带html标签的内容就会导致校验失败异常,从而得不到想要的结果,关闭的方法是在相应方法头部添加 ...

  8. .msi安装包安装方法(安装错误2503和2502)

    把鼠标放到Win8屏幕的最左下角,等待Win8 Metro界面的缩略图出现后点击鼠标右键,在弹出的菜单中选择“命令提示符(管理员)”在“命令提示符(管理员)”中输入 msiexec /package ...

  9. 【Unity3D与23种设计模式】组合模式(Composite)

    前段时间在忙一个新项目 博客好久没有更新了 GoF中定义: "将对象以树状结构组合,用以表现部分-全体的层次关系.组合模式让客户端在操作各个对象或组合时是一致的." 是一致的意思就 ...

  10. windows系统安装jira

     主题介绍 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域,其配置灵活.功能全面.部署简单.扩展丰 ...