我正在创建一个使用Twisted模块和回调的程序。
但是,我一直遇到问题,因为异步部分损坏了。

我从先前的问题中也了解到,回调将在某个时刻执行,但这是不可预测的。

但是,我有一个特定的程序

j = calc(a)
i = calc2(b)
f = calc3(c)

if s:
  combine(i, j, f)


现在,布尔值scalc3完成的回调设置。显然,这会导致未定义的错误,因为在需要s之前未执行回调。
但是,我不确定您SHOULD如何使用Twisted进行异步编程的if语句。我一直在尝试许多不同的事情,但是找不到任何可行的方法。

有什么方法可以使用需要回调值的条件?

另外,我正在使用VIFF进行安全计算(使用Twisted):VIFF

最佳答案

也许您要查找的是twisted.internet.defer.gatherResults

d = gatherResults([calc(a), calc2(b), calc3(c)])
def calculated((j, i, f)):
    if s:
        return combine(i, j, f)
d.addCallback(calculated)


但是,这仍然存在s未定义的问题。我不太清楚您如何定义s。如果它是calc3中的局部变量,则需要返回它,以便调用者可以使用它。

也许calc3看起来像这样:

def calc3(argument):
    s = bool(argument % 2)
    return argument + 1


因此,请考虑使其如下所示:

Calc3Result = namedtuple("Calc3Result", "condition value")

def calc3(argument):
    s = bool(argument % 2)
    return Calc3Result(s, argument + 1)


现在,您可以重写调用代码,这样它才能真正起作用:

不清楚您在这里要问什么。听起来您知道什么是回调,但是如果是这样,那么您应该可以自己得出以下答案:

d = gatherResults([calc(a), calc2(b), calc3(c)])
def calculated((j, i, calc3result)):
    if calc3result.condition:
        return combine(i, j, calc3result.value)
d.addCallback(calculated)


或者,根据您的以下评论,也许calc3看起来更像这样(这是我要做出的最后一个猜测,如果错了,并且您想输入更多信息,那么请实际上共享calc3的定义):

def _calc3Result(result, argument):
    if result == "250":
        # SMTP Success response, yay
        return Calc3Result(True, argument)
    # Anything else is bad
    return Calc3Result(False, argument)

def calc3(argument):
    d = emailObserver("The argument was %s" % (argument,))
    d.addCallback(_calc3Result)
    return d


幸运的是,此calc3的定义将与紧接上方的gatherResults / calculated代码块配合使用。

关于python - 如果在异步python程序中扭曲则有条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17275921/

10-10 14:44