2012-08-03 34 views
6

对不起模糊的标题,但我找不到更好的东西。扭曲的反应堆得到当前状态

有什么方法可以使反应堆的当前状态扭转? 通过状态我的意思是:

  • 侦听的端口
  • 互联协议
  • Deferreds正在等待被解雇
  • LoopingCalls运行
  • 主题是 “闲置”
  • 和其他“活跃”的东西...

基本上我试图弄清楚反应堆是否只是坐着。 这个问题本身比我实际需要做的更广泛,为了完成stackoverflow。

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

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

  • 只能监听1端口,而不能监听其他端口。
  • 没有缓存,也没有loopingCalls会发射。

我搜索,但只发现像“如reactor.running”或Stop twisted reactor on a condition,需要通过使用标志保持跟踪的东西。 我不想碰他的代码。如果这可能会导致扭曲,我宁愿这样做。 但是,如果已经有其他选择,我宁愿不重新发明轮子。

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

回答

2

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

虽然这个反应堆确实有一点反思支持。例如,有IReactorTime.getDelayedCalls,IReactorFDSet.getReaders/getWritersIReactorThreads.getThreadPool。然而,没有IReactorWin32Events.getAllEvents,所以这不是一个完全便携的东西。为了调试和诊断目的,如果您想贡献更多的反应堆内省实现,我们一定会很感激。

+0

感谢标志符号的答案。 – SleepyMan 2012-08-03 14:10:52

+0

谢谢@Glyph的答案。按习惯进入。我真的不想惹他的代码因为我的哲学与他的冲突。但是如何将我的代码与IService集成在一起?不同的进程通过套接字通信?好吧,无论如何,我会通知他他的剧本需要改变。同时,在实际贡献之前,我会尝试更多地了解一下扭曲的内部结构(我认为了解扭曲的哲学是很好的,对吧?)。学习这些东西的唯一方法是阅读源代码或将它记录在某处? – SleepyMan 2012-08-03 14:24:43