twisted反应器过早停止

3 投票
1 回答
1170 浏览
提问于 2025-04-15 22:33

我正在写一个批处理脚本,用来连接到一个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() 方法,这两个地方可能是检测你“我完成了”的条件的合适位置。

撰写回答