我正在创建一个使用Twisted模块和回调的程序。
但是,我一直遇到问题,因为异步部分损坏了。
我从先前的问题中也了解到,回调将在某个时刻执行,但这是不可预测的。
但是,我有一个特定的程序
j = calc(a)
i = calc2(b)
f = calc3(c)
if s:
combine(i, j, f)
现在,布尔值
s
由calc3
完成的回调设置。显然,这会导致未定义的错误,因为在需要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/