zoukankan      html  css  js  c++  java
  • 理解twisted中的reactor和deferred(二)

    Deferred可以添加多个回调函数,每个回调函数的结果作为下一个回调函数的参数

    代码实例(可在pycharm中运行,摘自 https://twistedmatrix.com/documents/current/core/howto/defer.html

    from twisted.internet import reactor, defer
    
    class Getter:
        def gotResults(self, x):
            """
            The Deferred mechanism provides a mechanism to signal error
            conditions.  In this case, odd numbers are bad.
    
            This function demonstrates a more complex way of starting
            the callback chain by checking for expected results and
            choosing whether to fire the callback or errback chain
            """
            if self.d is None:
                print("Nowhere to put results")
                return
    
            d = self.d
            self.d = None
            if x % 2 == 0:
                d.callback(x*3)  # 执行d的第一个回调函数,也就是_toHTML函数
            else:
                d.errback(ValueError("You used an odd number!")) # 执行d的errorback回调函数,也就是ebPrintError
    
        def _toHTML(self, r):
            """
            This function converts r to HTML.
    
            It is added to the callback chain by getDummyData in
            order to demonstrate how a callback passes its own result
            to the next callback
            """
            return "Result: %s" % r  #返回给第二个回调cbPrintData函数做参数
    
        def getDummyData(self, x):
            """
            The Deferred mechanism allows for chained callbacks.
            In this example, the output of gotResults is first
            passed through _toHTML on its way to printData.
    
            Again this function is a dummy, simulating a delayed result
            using callLater, rather than using a real asynchronous
            setup.
            """
            self.d = defer.Deferred()
            # simulate a delayed result by asking the reactor to schedule
            # gotResults in 2 seconds time
            reactor.callLater(2, self.gotResults, x)  # 2秒后执行gotResults函数
            self.d.addCallback(self._toHTML)  # 添加第一个回调函数
            return self.d
    
    def cbPrintData(result):
        print(result)
    
    def ebPrintError(failure):
        import sys
        sys.stderr.write(str(failure))
    
    # this series of callbacks and errbacks will print an error message
    g = Getter()
    d = g.getDummyData(3)
    d.addCallback(cbPrintData)
    d.addErrback(ebPrintError)
    
    # this series of callbacks and errbacks will print "Result: 12"
    g = Getter()
    d = g.getDummyData(4)
    d.addCallback(cbPrintData) # 添加第二个回调函数
    d.addErrback(ebPrintError)
    
    reactor.callLater(4, reactor.stop)
    reactor.run()
    

     

    结果:

    官网示例图片:这里的Data Source就是 gotResults 函数,执行Deferred 的callback函数相当于把result给到callback模块,结果一级一级传递给所有的callback函数,任何一级callback出现错误,都将调用errback函数

    同时,如果errback没有返回exception 或者 return a twisted.python.failure.Failure instance,将切回callback继续执行

  • 相关阅读:
    判断回溯法中的标记数组vis在回溯的时候是否要取消标记?
    Linux多线程开发I
    答题小程序开发
    答题活动小程序
    今天来谈谈答题小程序的上下游生态
    挑战答题小程序V2.0
    可以免费出题的答题小程序
    挑战答题小程序上线了
    通过小程序反编译来谈谈小程序的分包加载机制?
    本文介绍下答题小程序V6.0
  • 原文地址:https://www.cnblogs.com/WalkOnMars/p/11927687.html
Copyright © 2011-2022 走看看