6

抱歉标题含糊不清,但我想不出更好的东西。

有什么方法可以让反应堆的当前状态处于扭曲状态?我所说的状态是指:

  • 端口监听器
  • 连接的协议
  • 等待被解雇的延期者
  • 正在运行的循环调用
  • “空闲”的线程
  • 和其他“活跃”的东西......

基本上我想弄清楚反应堆是否只是闲置。为了stackoverflow的完整性,这个问题本身比我实际需要做的更广泛。

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

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

  • 只监听 1 个端口,没有其他端口。
  • 没有延迟或循环调用会触发。

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

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

4

1 回答 1

3

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

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

于 2012-08-03T04:44:12.530 回答