博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
twisted 的延迟对象deferred
阅读量:5775 次
发布时间:2019-06-18

本文共 2311 字,大约阅读时间需要 7 分钟。

hot3.png

deferred “异步”功能的实现,与多线程完全不同,具有以下特点:1. deferred 产生的 event,是函数调用返回的对象;2. deferred 代表一个连接任务,负责报告任务执行的延迟情况和最终结果;3. 对deferred 的操作,通过预定的“事件响应器”(event handler)进行。defer的使用方式:1). 在factory中创建deferred对象,但在调用factory对象之外返回自身的deferred对象,然后再添加callback和errback, 具体示例如下:#! /usr/bin/env python#coding=utf-8from twisted.internet import reactor, defer, protocolclass CallbackAndDisconnectProtocol(protocol.Protocol):     def connectionMade(self):        self.factory.deferred.callback("Connected!")        # self.transport.loseConnection()class ConnectionTestFactory(protocol.ClientFactory):    protocol = CallbackAndDisconnectProtocol    def __init__(self):        self.deferred = defer.Deferred()       def clientConnectionFailed(self, connector, reason):        self.deferred.errback(reason)def testConnect( port):     testFactory = ConnectionTestFactory()     reactor.listenTCP(port, testFactory)     return testFactory.deferreddef handleSuccess(result, port):     #deferred "event-responsor": handle finished connection     print 'result-----',result     print "Connected to port %i" % port     # reactor.stop()def handleFailure(failure, port):     print "Error connecting to port %i: %s" % (port, failure.getErrorMessage())     # reactor.stop()if __name__ == '__main__':    port = 50001    conndefer = testConnect(port)    conndefer.addCallback(handleSuccess, port)    conndefer.addErrback(handleFailure, port)    reactor.run()2). 不显示创建deferred对象, 在函数返回时,我们调用defer.succeed(results)函数。其中result则可以为调用我们延时操作函数返回的结果。示例如下:#! /usr/bin/env python#coding=utf-8from twisted.internet import protocol, reactor, deferfrom twisted.protocols import basicclass FingerProtocol(basic.LineReceiver):    def lineReceived(self, user):         self.factory.getUser(user             ).addErrback(lambda _: "Internal error in server"             ).addCallback(lambda m:                           (self.transport.write(m+"/r/n")))class FingerFactory(protocol.ServerFactory):     protocol = FingerProtocol     def __init__(self, **kwargs):        self.users = kwargs        print self.users     def getUser(self, user):         return defer.succeed(self.users.get(user, "No such user"))if __name__ == '__main__':     reactor.listenTCP(1077, FingerFactory(hd='Hello my python world'))     reactor.run()

转载于:https://my.oschina.net/u/1458120/blog/552430

你可能感兴趣的文章
JS中比较数字大小
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
我的友情链接
查看>>
显式锁(第十三章)
查看>>
看linux书籍做的一些重要笔记(2011.07.03更新)
查看>>
从案例学RxAndroid开发(上)
查看>>
Redis学习手册(内存优化)
查看>>
浅尝TensorFlow on Kubernetes
查看>>
springboot系列十 Spring-Data-Redis
查看>>
excel进行矩阵计算
查看>>
基于Android平台的动态生成控件和动态改变控件位置的方法
查看>>
BOM
查看>>
iOS: Block的循环引用
查看>>
MySQL类型转换
查看>>
变量声明提升1
查看>>
系列文章目录
查看>>
手把手教你如何提高神经网络的性能
查看>>
前端布局原理涉及到的相关概念总结
查看>>