扭曲延迟链接

时间:2016-01-11 13:11:15

标签: python twisted deferred

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

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

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

Cho

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

my_hash.map { |k, a| [k, a.size] }.to_h.sort_by {|_key, value| value}.to_h.keys.last(2)

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

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

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

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)

因为仅在链的末尾需要def run_mods(self, level): pass (Milter.ReturnCodes.CONTINUE)

1 个答案:

答案 0 :(得分:0)

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

>>> 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'>>,)

任何给定的&#34;阶段&#34;在一系列回调中,可以很容易地知道它是否遵循错误状态,无论是添加方式,作为addErrback()的参数,还是addCallbacks()的第二个参数,或者通过它的参数是Failure()

的一个实例

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