- 浏览: 543035 次
- 性别:
- 来自: 北京-郑州
文章分类
最新评论
-
痛苦不忧伤:
非常简单清晰
java向上转型 -
fusionyu:
IndexWriter没有正常关闭,导致索引循环能修复不?怎么 ...
关于搜索开发过程中的总结 -
yong7356:
学习一下。。。。。。。
eclipse打jar包 -
Zengchen2:
讲得很实用
内部类使用场景二:实现回调函数 -
sun19890214:
mark下,一些能看懂,一些看不懂
关于搜索开发过程中的总结
Deferred:
提供了让程序查找非同步任务完成的一种方式,而在这时还可以做其他事情。当函数返回一个Deferred对象时,说明获得结果之前还需要一定时间。为了在任务完成时
获得结果,可以为Deferred指定一个事件处理器
非阻塞通讯:
当前有一个请求,当获得连接之后,需要进行数据库的读写操作,同时还有其他线程也等着连接:
那么可以讲当前获得连接后进行数据库操作的这个任务挂起来,然后直接去处理其他线程,当挂起的线程处理结果出来时候,直接返回一个结果就可以了。这样子节约
了资源,提高了效率;
需要为挂起的任务保持一个上下文环境的存储,就用defer来完成这个任务,之所以要保持上下文环境的存储是因为你的操作还没有结束,下面你还要去调用当前的任务
,那你肯定得有一个上下文的环境才可以的。利用defer保存当前任务的环境信息,通过定义callback函数来进行最后结果的回调。
Twisted使用Deferred对象来管理callback序列。作为Twisted库的“客户端”,应用程序将一连串函数添加到Deferred对象中,当异步请求的结果准备就绪时,这一连
串函数将被按顺序调用(这一连串函数被称为一个callback序列,或是一条callback链),一起添加的还有另外一连串函数,当异步请求出现错误的时候,他们将被调
用(称作一个errback序列,或是一条errback链)。异步库代码会在结果准备就绪时,调用第一个callback,或是在出现错误时,调用第一个errback,然后Deferred对
象就会将callback或errback的返回结果传递给链中的下一个函数。
Deferred解决的问题
Deferred被设计用来帮助解决第二类并发问题——非计算集中型任务,并且延迟时间是可以估计的。等待硬盘访问,数据库访问和网络访问的函数都属于这一类,尽管
时间延迟不尽相同。
Deferred被设计用来使Twisted程序可以无阻塞地等待数据,直到数据准备就绪。为了达到这个目的,Deferred为库与应用程序提供了一个简单的callback管理接口。库
可以通过调用Deferred.callback来把准备就绪的数据传回给应用程序,或者调用Deferred.errback来报告一个错误。应用程序可以按它们希望的顺序,设置结果处理逻
辑,以callback与errback的形式添加到Deferred对象中去。
使CPU尽可能的有效率,是Deferred与该问题的其他解决方案背后的基本思路。如果一个任务在等待数据,与其让CPU(以及程序本身!)眼巴巴地等着数据(对于进程
,这通常叫做“阻塞”),不如让程序同时执行些别的操作,并且同时留意着某些信号——一旦数据准备就绪,程序就可以(但不是立即——译者注)回到刚才的地方
继续执行。
在Twisted里,一个函数返回一个Deferred对象,意味着它给调用者一个信号:它在等待数据。当数据准备就绪后,程序就会激活那个Deferred对象的callback链,来处
理数据。
Deferred——数据即将到来的信号
在之前我们发送电子邮件的例子中,父函数调用了一个连接远程服务器的函数。异步性要求这个连接函数必须不等待结果而直接返回,父函数才可以做其他事情。可是
,父函数或者它的控制程序又是怎么知道连接尚未建立的呢?当连接建立后,它又是怎么使用连接的呢?
Twisted有一个对象可以作为这种情况的一个信号。连接函数返回一个twisted.internet.defer.Deferred对象,给出一个操作尚未完成的信号。
Deferred有两个目的。第一,它说“我是一个信号,只是通知你不管你刚才要我做的什么,结果还没有出来”。第二,你可以让Deferred在结果出来后执行你的东西。
callback
添加一个callback——这就是你让Deferred在结果出来后执行你东西的办法,也就是让Deferred在结果出来后调用一个方法。
有一个Twisted库函数返回Deferred,就是twisted.web.client.getPage(这是一个异步获取网页的函数。——译者注)。在这个例子里,我们调用了getPage——它返
回了一个Deferred,然后添加了一个callback来处理返回的页面内容——当然处理是发生在数据准备就绪之后:
from twisted.web.client import getPage
from twisted.internet import reactor
def printContents(contents):
'''
这就是“callback”函数,被添加到Deferred,当“承诺了一定会有的数据”准备就绪后,
Deffered会调用它
'''
print "Deferred调用了printContents,内容如下:"
print contents
# 停止Twisted事件处理系统————这通常有更高层的办法
reactor.stop()
# 调用getPage,它会马上返回一个Deferred————承诺一旦页面内容下载完了,
# 就会把他们传给我们的callback们
deferred = getPage('http://twistedmatrix.com/')
# 给Deferred添加一个callback————要求它在页面内容下载完后,调用printContents
deferred.addCallback(printContents)
# 启动Twisted事件处理系统,同样,这不是通常的办法
reactor.run()
添加两个callback是一种非常常见的Deferred用法。第一个callback的返回结果会传给第二个callback:
from twisted.web.client import getPage
from twisted.internet import reactor
def lowerCaseContents(contents):
'''
这是一个“callback”函数,被添加到Deferred,当“承诺了一定会有的数据”准备就绪后,
Deffered会调用它。它把所有的数据变成小写
'''
return contents.lower()
def printContents(contents):
'''
这是一个“callback”函数,在lowerCaseContents之后被添加到Deferred,
Deferred会把lowerCaseContents的返回结果作为参数,调用这个callback
'''
print contents
reactor.stop()
deferred = getPage('http://twistedmatrix.com/')
# 向Deferred中添加两个callback————让Deferred在页面内容下载完之后执行
# lowerCaseContents,然后将其返回结果作为参数,调用printContents
deferred.addCallback(lowerCaseContents)
deferred.addCallback(printContents)
reactor.run()
错误处理:errback
正如异步函数会在其结果产生之前返回,在有可能检测到错误之前返回也是可以的:失败的连接,错误的数据,协议错误,等等。正如你可以将callback添加到
Deferred,你也可以将错误处理逻辑(“errback”)添加到Deferred,当出现错误,数据不能正常取回时,Deferred会调用它:
from twisted.web.client import getPage
from twisted.internet import reactor
def errorHandler(error):
'''
这是一个“errback”函数,被添加到Deferred,当出现错误事件是,Deferred将会调用它
'''
# 这么处理错误并不是很实际,我们只是把它打出来:
print "An error has occurred: <%s>" % str(error)
# 然后我们停止整个处理过程:
reactor.stop()
def printContents(contents):
'''
这是一个“callback”函数,被添加到Deferred,Deferred会把页面内容作为参数调用它
'''
print contents
reactor.stop()
# 我们请求一个不存在的页面,来演示错误链
deferred = getPage('http://twistedmatrix.com/does-not-exist')
# 向Deferred添加callback,以处理页面内容
deferred.addCallback(printContents)
# 向Deferred添加errback,以处理任何错误
deferred.addErrback(errorHandler)
reactor.run()
发表评论
-
python下innodb的数据提交问题
2010-07-12 18:00 1946mysql数据库存储引擎从isam转移到了innodb 今天 ... -
Python解释执行原理
2010-04-21 11:00 7469谈到了Python语句的两种 ... -
python基础补习
2010-04-21 10:55 1567Python是一种解释性的 ... -
dbutils安装笔记以及mysql数据库操作问题
2010-04-02 11:05 4739dbutils安装笔记; tar -zxvf DBUt ... -
twisted单线程多任务
2010-04-02 10:10 2921关于单线程多任务刚 ... -
python 多线程 gil
2010-03-16 19:01 3199python里的多线程是单cpu ... -
dbutils,sqlobject,SQLAlchemy
2009-08-22 18:26 3473Python DBUtils 提供了稳固的、持久的到数据库的连 ... -
os.open当中的读写选项
2009-07-22 15:40 19861、读文件 读文本文件 input = open('dat ... -
JE API 闲聊实现
2009-06-12 18:29 1579注意:用到json-python进行json字符串的解析,需要 ... -
httplib,urllib和urllib2的了解学习
2009-06-12 15:30 9659httplib — HTTP protocol client: ... -
struct的pack和unpack方法
2009-06-03 23:55 18653这两天做TCP协议,数据 ... -
针对twisted--Defered的单线程多任务的理解
2009-06-03 23:13 2741从网上找了不少关于twis ... -
reactor.ConnectTCP的源码分析
2009-06-03 15:05 5298reactor.ConnectTCP(host,port,xx ... -
Twisted基本模型
2009-06-03 14:27 5459一、Twisted基本模型Twisted 网络编程框架是一种基 ... -
并发编程的概念知识以及twisted的引出
2009-06-03 10:27 1674并发编程介绍:要完成某些计算任务经常需要不少时间,其原因有两点 ... -
使用wxPython实现mail的简单客户端
2009-05-22 15:22 2198本程序的目的是:结合当前所学习的wxPython的理论知识,同 ... -
wxPython的Core组件--其他sizer
2009-05-14 22:42 14501、WX.GridSizer: wx.GridSizer(i ... -
wxPython的Core组件--BoxSizer
2009-05-13 12:32 4724wx.BoxSizer: box = wx.BoxSiz ... -
wxPython的Controls组件学习1----Menus and Toolbars
2009-05-11 23:54 1817To implement a menubar in wxPyt ... -
wxPython的windows构件的具体学习
2009-05-10 16:50 1957按照前面的总结思路 ...
相关推荐
- **Twisted的异步编程特点**:介绍Twisted中实现异步编程的关键技术,比如`Deferred`对象和回调链等。 #### 初识Twisted 在这一部分,文档开始引导读者实际接触Twisted的基本用法。 - **Twisted的安装与配置**:...
本教程深入介绍了Twisted的理论基础、异步编程模式与Reactor的初探、Twisted支持的客户端与服务器的开发以及Deferred对象的使用。Deferred是Twisted框架中用于处理异步操作完成后的回调函数的对象,它能够帮助开发者...
此外,Twisted还提供了`deferred`对象,用于管理异步操作的流程控制,使得异步编程更加清晰和易于理解。 在实际应用中,Twisted常用于构建高可用性和高性能的网络服务,如聊天服务器、文件传输服务、流媒体服务器等...
- **Deferred**:这部分详细介绍了Deferred对象的功能及其在Twisted中的作用,包括如何使用它们来组织异步操作的执行顺序。 #### 第八至第十八部分:从使用Deferred的诗歌下载客户端到Deferreds全貌 - **使用...
Twisted 是一个强大的 Python 库,用于构建网络应用,尤其在异步编程和网络协议方面表现出色。这个 "twisted_demo.zip" 文件包含了一个使用 Twisted 框架实现的客户端和服务器通信的示例,它有助于理解如何利用 ...
Twisted通过Deferred的错误回调和异常传播机制提供了优雅的错误处理方式。 3. **并发和并行性**:通过合理使用异步和回调,Twisted可以在单线程中实现高效的并发处理,避免了线程同步带来的复杂性和开销。 4. **...
通过对Reactor模型和Deferred机制的学习,开发者可以更好地理解和掌握Twisted的核心思想,进而有效地利用Twisted解决实际问题。无论是对于初学者还是经验丰富的开发者来说,Twisted都提供了丰富的工具和API,帮助...
5. **延迟调用与定时器**:Twisted提供了延迟调用(Deferred)机制,用于处理异步操作的结果。示例可能演示如何使用延迟调用来处理未来的操作。 6. **认证与加密**:Twisted包含了多种安全协议,如SSL/TLS加密,...
- **异步编程**:Twisted 倡导使用异步编程模型,这有助于提高程序的响应性和效率。通过使用回调函数和 Deferred 对象等机制,可以有效地处理并发任务。 - **可扩展性**:Twisted 提供了丰富的 API 和插件系统,使得...
**Twisted和Scrapy是两个在Python编程领域中非常重要的框架,它们分别专注于网络异步I/O和网络爬虫开发。** **Twisted** 是一个开源的Python库,主要用于实现异步网络编程。它提供了丰富的网络协议支持,包括TCP、...
在第七部分到第九部分中,教程引入了Deferred对象,这是Twisted框架中用于管理异步操作结果的一种机制。Deferred对象可以将回调函数的书写模式进一步抽象,使得异步编程更加简洁明了。这部分详细地讲述了Deferred的...
总的来说,理解Twisted的Reactor和Deferred机制是掌握其核心的关键。通过Reactor的事件驱动模型和Deferred的异步回调,开发者可以构建出高效、可扩展的网络应用程序。在实际开发中,掌握这两者间的交互,以及如何...
7. **Concurrency**: 除了传统的回调机制,`Twisted` 还引入了协程(`Deferred`)的概念,使得异步编程更加直观和易于管理。 8. **Testing**: `Twisted` 内置了测试框架` Trial`,用于编写和执行单元测试,确保代码的...
7. **Concurrent Programming**:Twisted提供了异步和并发编程的工具,如Deferred对象,允许开发者编写非阻塞的异步代码,提高程序的效率。 使用Twisted可以开发各种网络应用,如聊天服务器、代理服务器、分布式...
当异步处理中的结果返回时,Deferred将会启动并以添加时的顺序触发回调链。 用实例也许更容易说明,首先来看看addCallback: from twisted.internet.defer import Deferred def myCallback(result): print result...
在Python的Twisted框架中,异步编程是通过 Deferred 对象来实现的,它是一种强大的工具,用于管理回调函数,特别是在处理非阻塞I/O和异步操作时。 Deferred 对象的核心在于它能够将多个回调函数组织成一个执行序列,...
`Deferred`是Twisted中处理异步操作的关键抽象。它是一个承诺,表示在未来某个时间点将提供一个结果。通过链式调用`addCallback`和`addErrback`方法,可以注册回调函数来处理成功的结果或错误情况,这样可以编写出...
- **Deferreds概念**:Deferred是Twisted中处理异步调用的主要机制。它代表了一个未来可能完成或失败的操作的结果。通过使用Deferreds,开发者可以构建复杂的异步逻辑而无需编写复杂的回调函数链。 - **解决的问题*...