延迟(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. 【NOI2008】假面舞会(图论,搜索)

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

  2. 【BZOJ1801】【AHOI2009】中国象棋(动态规划)

    [BZOJ1801][AHOI2009]中国象棋(动态规划) 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个 ...

  3. 对java的Thread的理解

    最好不适用线程的子线程,直接调用线程,然后用rannable接口 然后如果要公用一个参数,就是公用资源的时候,一定要在run方法的前面加上synchronized 例子 猫和狗喝同一杯水(共用资源的问 ...

  4. TC命令流量控制测试(针对具体IP和具体进程)

    TC命令流量控制测试 这里测试系统为Linux操作系统,通过简单的TC命令来实现对带宽的控制. 1对具体IP地址的流量控制 这里采用iperf来进行带宽的测试,首先在服务器和客户端都安装上iperf软 ...

  5. Java equals() 和hashCode()方法详解

    Java的Object类中定义了equals方法,Object类中的equals方法源代码如下,从源代码中可以看出Object类中的equals方法是用来返回判断两个对象是否指向同一个对象(引用地址) ...

  6. Unity服务端链接MySQL数据库

    链接数据库,可以分为以下几个流程: 链接MySQL(数据库地址.端口.用户名.密码) 选择数据库 执行sql语句 关闭数据库 转换为代码如下: using System; using MySql.Da ...

  7. webuploader 上传文件 生成链接下载文件

    最近 在asp.net MVC 项目 需要实现一个Excel和 图片上传功能.之前有使用过SWFUpload 做过上传图片功能,在本次实现过程中,有人推荐WebUploader 上传组件,因此采用we ...

  8. redis五种基本类型CRUD操作

    1.String 增:set key1 value1 改:set key1 new-value.自增 incr key1.按照特定值递增:increby key1 inrevalue 删:del ke ...

  9. 关闭NetworkManager的作用

    author: headsen  chen date: 2017-11-21  13:34:23 个人原创 重启网卡后,会造成网卡失效,报错如下: Bringing up interface eth0 ...

  10. Cesium polygon中的height和extrudedHeight的区别

    1.height参数:  多边形和椭球表面之间的距离(以米为单位). 2.extrudedHeight参数:  多边形的挤压面与椭球面之间的距离(以米为单位).