扭曲反应器获得当前状态

时间:2012-08-03 02:01:51

标签: python twisted

对于模糊的标题感到抱歉,但我无法找到更好的东西。

有没有办法让反应堆的当前状态扭曲? 按状态我的意思是:

  • 端口监听器
  • 连接协议
  • 等待被解雇的延期
  • 正在运行的LoopingCalls
  • “空闲”的主题
  • 和其他“活跃”的东西......

基本上我正在试图弄清楚反应堆是否只是懒散地坐着。 为了Stackoverflow的完整性,问题本身比我实际需要做的更广泛。

现在,我目前的情况如下:

我正在使用其他人的脚本来侦听由此人的脚本选择的许多“动态”端口,因此我不能只使用我的脚本执行listenTCP或TCP4ServerEndpoint之类的操作并检查其状态。 这有点类似于非PASV FTP,每次使用后都会丢弃每个侦听端口。 另一个问题是我自己的小程序也在同一个进程中运行,我用它作为启动程序的参数。它基本上是他的程序的接口。 当他所有的事情都完成了,我的事情也完成了,我想关闭反应堆。 因此,我试图找出何时可以停止反应堆。 我关闭的确切条件如下:

  • 只收听1个端口,而不是其他端口。
  • 没有任何反对,也没有循环的呼叫。

我搜索了但只发现了“if reactor.running”或Stop twisted reactor on a condition之类的东西,需要使用标记来跟踪。 我宁愿不碰他的代码。如果它有可能导致扭曲,我宁愿这样做。 但如果已有替代方案,我宁愿不重新发明轮子。

他的脚本是否需要更改,以便通知我的脚本这些条件?

1 个答案:

答案 0 :(得分:2)

您要调用的代码应该被重构以从某些内容返回Deferred;可能是IService.stopService的实现阻止了它。这样做的原因是你不会总是知道在反应堆中会坐着什么,即使事情显然是空闲的#34;例如,你知道Twisted维护一个文件描述符(" waker")来进行线程通信吗? HTTP服务器始终保持callLater未完成以写入下一个访问日志条目?第三方库中的其他基础设施可能会在反应堆中留下任意不同的状态,这实际上与您无关。

虽然反应堆确实有一点反省支持。例如,有IReactorTime.getDelayedCallsIReactorFDSet.getReaders/getWritersIReactorThreads.getThreadPool。但是,没有IReactorWin32Events.getAllEvents,所以这不是一套完全可移植的东西。如果您想为调试和诊断目的贡献更多的反应堆内省实现,我们非常感激。