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 ...
随机推荐
- DirectSound---3D环境
DirectSound对于单声道的Wav文件(或者说对于单声道的PCM音频数据)提供了内置3D音效的模拟,你能够控制每一个声源和收听者的立体位置,对移动的物体应用多普勒效果等等.在单个应用程序中,可以 ...
- Jenkins + Github持续集成构建Docker容器,维基百科&人工自能(AI)模块
本文分两部分,第一部分是手动计划任务的方式构建Github上的Docker程序,第二部分是用Github webhook Trigger一个自动构建任务. Jenkins采用2.5版本Docker采用 ...
- 三天来都在写项目;今天开始学习了js
JavaScript 一种脚本语言,他描述了网页的行为:他是和java一种完全不同的语言 JavaScript的输出写法有四种: JavaScript的语言的变量必须以字母.美元符号$ 或者下划线_来 ...
- 《阿里巴巴Android编码规范》阅读纪要(一)
版权声明:本文出自汪磊的博客,转载请务必注明出处. 2月28日阿里巴巴首次公开内部安卓编码规范,试想那么多业务线,开发人员,没有一套规范管理起来是多么麻烦,以下是个人阅读Android基本组件部分过程 ...
- oracle sql model从句demo
model从句作用 sql model可以完成像EXCEL工作表的数据内容扩展.计算填充的功能 关键词解释 partition 分区关键词,白话就是分组 dimension 度量关键词,白话就是要取出 ...
- Mybatis+Mysql插入数据库返回自增主键id值的三种方法
一.场景: 插入数据库的值需要立即得到返回的主键id进行下一步程序操作 二.解决方法: 第一种:使用通用mapper的插入方法 Mapper.insertSelective(record): 此方法: ...
- ConcurrentHashMap源码解析(JDK1.8)
package java.util.concurrent; import java.io.ObjectStreamField; import java.io.Serializable; import ...
- 为什么TCP的ISN是随机的?
两个维度: 1)攻击维度 如果TCP每次连接都使用固定ISN,黑客可以很方便模拟任何IP与server建立连接. 问题:通过抓包就可以计算出来TCP连接的ISN,那固定于不固定ISN有什么区别呢? 答 ...
- Java面试宝典笔记录
1.一个.java文件中可以有多个类(不是内部类),但是只能有一个public类,且类名和文件同名.(一般不提倡这么写,一类一文件) 2.java保留字:goto, const. 3.访问权限控制 访 ...
- 笔记:I/O流-内存映射文件
内存映射文件时利用虚拟内存实现来将一个文件或者文件的一部分映射到内存中,然后整个文件就可以当作数组一样的访问,这个比传统的文件操作要快得多,Java 使用内存映射文件首先需要从文件中获取一个chann ...