lbfeng
V2EX  ›  问与答

Python twisted chian 实在没看懂这段代码

  •  
  •   lbfeng · Aug 8, 2018 · 1595 views
    This topic created in 2854 days ago, the information mentioned may be changed or developed.
    from twisted.internet import defer
    
    def status(*ds):
        return [(getattr(d, 'result', "N/A"), len(d.callbacks)) for d in ds]
    
    
    def b_callback(arg):
        print "b_callback called with arg =", arg
        return b
    
    
    def on_done(arg):
        print "on_done called with arg =", arg
        return arg
            
    a = defer.Deferred()
    b = defer.Deferred()
    
    a.addCallback(b_callback).addCallback(on_done)
    
    status(a, b) # [('N/A', 2), ('N/A', 0)]
    
    a.callback(3) # b_callback called with arg = 3
    
    status(a, b) # [(<Deferred at 0x7f219e4117a0>, 1), ('N/A', 1)]
    
    b.callback(4) # on_done called with arg = 4
     
    status(a, b) # [(4, 0), (None, 0)]
    

    a.callback(3) 之后 b 也有了 on_done callback。这里没明白。b.callback(4)之后 a 的 on_done 也执行了,但只输出了一个 on_done called with arg = 4,且 b 的 result 是 None 不是 4 ??

    1 replies    2018-08-09 02:31:26 +08:00
    lbfeng
        1
    lbfeng  
    OP
       Aug 9, 2018
    我自问自答吧。。。

    `b` get a callback function after `a.callback(3)`. By checking the source code( https://github.com/twisted/twisted/blob/twisted-18.7.0/src/twisted/internet/defer.py#L438). It seems that `b` is appended an "a is waiting for b to fire" callback. Chain would stop here since function `b_callback` return deferred `b`, and `b` would be the result of `a`. Note: if result is a value instead of a deferred object, chain will continue.

    `b.callback(4)` passes `4` to `a`'s next callback as an argument. `b` get a `None` as a result. The chain continues.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5576 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 07:10 · PVG 15:10 · LAX 00:10 · JFK 03:10
    ♥ Do have faith in what you're doing.