gpt4 book ai didi

python - 异步Python程序中的条件if与twisted

转载 作者:行者123 更新时间:2023-12-01 05:42:05 24 4
gpt4 key购买 nike

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

我了解到(也是从之前的问题中......)回调将在某个点执行,但这是不可预测的。

但是,我有一个类似的程序

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

if s:
combine(i, j, f)

现在, bool 值 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程序中的条件if与twisted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17275921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com