gpt4 book ai didi

twisted - 用twisted 连接两次——如何正确地做到这一点?

转载 作者:行者123 更新时间:2023-12-04 13:25:05 27 4
gpt4 key购买 nike

我想使用 twisted(和 StarPy,它是 asterisk ami 的协议(protocol)实现)连接到 asterisk 服务器。应用程序在那里启动传出传真。我发现了一些关于我的问题的提示,但我不知道如何正确处理这个问题。

第一份传真已正确发送。

Problem is, if I call twisted for the second time, the application keeps hanging in main loop.



我知道我可能不会在这里这样做:
from starpy import manager
from twisted.internet import reactor

def main():
f = manager.AMIFactory(cUser, cPass)
print "Login"
df = f.login(cServer, cPort)

def onLogin(protocol):
print "Logoff again"
df = protocol.logoff()

def onLogoff( result ):
print "Logoff erfolgt"
reactor.stop()

return df.addCallbacks( onLogoff, onLogoff )

def onFailure( reason ):
print "Login failed"
print reason.getTraceback()

df.addCallbacks( onLogin, onFailure )
return df

if __name__ == "__main__":
reactor.callWhenRunning( main )
reactor.run(installSignalHandlers=0)
print "runned the first time"

reactor.callWhenRunning( main )
reactor.run(installSignalHandlers=0)
print "will never reach this point"

我简化了代码——它只是再次登录+注销。它永远不会从第二个 reactor.run() 调用返回。

这是如何正确完成的?我被困在这里 - 在此先感谢。

最好的祝福,
弗洛里安。

最佳答案

正如 iny 所说,您只需调用 reactor.run 即可完成所有工作。和 reactor.stop .

如果我们考虑您发布的示例代码,我们会看到它采取了以下步骤:

  • 启动 react 堆
  • 连接、发送传真、断开
  • 停止 react 堆
  • 启动 react 堆
  • 连接、发送传真、断开
  • 停止 react 堆

  • 如果我们只删除步骤 3 和 4,那么程序实际上会做一件非常合理的事情。

    以下是您实现第 3 步的方式:
    def onLogoff( result ):
    print "Logoff erfolgt"
    reactor.stop()

    这导致第一次调用 reactor.run返回,为您执行第 4 步扫清道路:
    reactor.callWhenRunning( main )
    reactor.run(installSignalHandlers=0)

    因此,这里的总体思路是直接跳到第 5 步,而不是执行第 3 步和第 4 步。考虑如果重新定义 onLogoff 可能会发生什么。像这样:
    def onLogoff( result ):
    print "Logoff erfolgt"
    main()

    并删除示例的最后三行。这实际上会给你一个无限循环,因为相同的 onLogoff在第二次断开连接后运行并开始第三次连接。但是,您可以使用 main 的参数来解决此问题。控制重启行为的函数。

    一旦这变得有意义,您可能需要考虑将重试注销移出 main函数并进入 __main__ 中定义的回调堵塞。这是 Deferreds 强大功能的重要组成部分:它允许您在事件源的实现(在本例中为您的传真发送函数)和处理结果事件的代码(发送第二个传真,或退出,在这种情况下)。

    关于twisted - 用twisted 连接两次——如何正确地做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1979112/

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