【问题标题】:Twisted deferred chaining扭曲的延迟链接
【发布时间】:2016-01-11 13:11:15
【问题描述】:

我有一个异步管理模块调用的应用程序:

  • 它请求一个触发自身的延迟
  • 附加自定义回调
  • 检查返回的代码是否=CONTINUE,否则处理错误

这是返回延迟到主应​​用程序的代码:

def xxfi_connect(self, hostname):
    d = defer.Deferred()
    d.callback(Milter.ReturnCodes.CONTINUE)
    return d

要异步附加一些代码,我需要将我的函数调用挂接到延迟函数中,如下所示:

d = defer.Deferred()
d.addCallback(self.run_mods, application.L_CONNECT)
d.callback(Milter.ReturnCodes.CONTINUE)

问题是每个连接的函数都会收到一个包含回调参数(application.L_CONNECT)的参数。

是否可以在不传输每个函数调用的返回码的情况下实现这一点?

理想情况下,我希望我的回调函数是这样的:

def run_mods(self, level):
    pass

而不是

def run_mods(self, code, level):
    pass

因为code (Milter.ReturnCodes.CONTINUE) 只需要在链的末端

【问题讨论】:

    标签: python twisted deferred


    【解决方案1】:

    区分成功或错误Deferred()s 已经是它们内置的功能。

    >>> from twisted.internet import defer
    >>> d = defer.Deferred()
    >>> def errors(*args): raise Exception("i'm a bad function")
    >>> def sad(*arg): print "this is not so good", arg
    >>> def happy(*arg): print "this is good", arg
    >>> d.addCallback(errors)
    <Deferred at 0x106821f38>
    >>> d.addCallbacks(happy, sad)
    <Deferred at 0x106821f38>
    >>> d.callback("hope")
    this is not so good (<twisted.python.failure.Failure <type 'exceptions.Exception'>>,)
    

    回调链中的任何给定“阶段”都可以很容易地知道它是否处于错误状态,无论是通过添加方式,作为addErrback() 的参数,还是addCallbacks() 的第二个参数,或者凭借它的论点是Failure()的一个实例@

    有关延迟链接的更多信息,请参阅:https://twistedmatrix.com/documents/14.0.1/core/howto/defer.html

    【讨论】:

    • 谢谢,这确实是我可以做的事情,但如果更一般地说,我将 2 延迟并不想将顶部的结果发送给子 1 怎么办?这可能吗?
    • 你可以插入一个回调函数来丢弃一些参数,即:d.addCallback(lambda a, b: b)
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多