twisted反应器过早停止
我正在写一个批处理脚本,用来连接到一个TCP服务器,然后退出。我的问题是,我无法停止反应器,比如:
cmd = raw_input("Command: ")
# custom factory, the protocol just send a line
reactor.connectTCP(HOST,PORT, CommandClientFactory(cmd)
d = defer.Deferred()
d.addCallback(lambda x: reactor.stop())
reactor.callWhenRunning(d.callback,None)
reactor.run()
在这段代码中,反应器在TCP连接完成之前就停止了,命令也没有执行完。
我该如何在所有操作完成后再停止反应器呢?
1 个回答
5
简单的解决办法是在你的代码中,当你检测到退出条件时,调用 reactor.stop()
。具体来说,你应该在 CommandClient 中的某个地方调用它,假设是在它把命令发送到远程机器并接收到命令的退出代码之后。
按照现在的写法,反应器会启动并立即执行 d.callback
,而这个回调又会调用 reactor.stop()
。这意味着你的程序逻辑和调用 reactor.stop()
之间没有任何联系。你需要把这个调用放到程序的核心逻辑中,这样就可以了。具体来说,我建议你看看 CommandClient 协议中的 connectionMade()
和 dataReceived()
方法,这两个地方可能是检测你“我完成了”的条件的合适位置。