【问题标题】:Twisted reactor get current status扭曲的反应堆获取当前状态
【发布时间】:2012-08-03 02:01:50
【问题描述】:

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

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

  • 端口上的侦听器
  • 连接的协议
  • 等待被解雇的延迟
  • 正在运行的 LoopingCalls
  • “空闲”的线程
  • 和其他“活跃”的东西...

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

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

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

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

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

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

【问题讨论】:

    标签: python twisted


    【解决方案1】:

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

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

    【讨论】:

    • 感谢@Glyph 的回答。按习惯按 Enter。我真的不想弄乱他的代码,因为我的哲学与他的冲突。但是我如何将我的代码与他的 IService 集成?不同的进程通过套接字进行通信?好吧,无论哪种方式,我都会通知他他的剧本需要更改。同时,在实际做出贡献之前,我会尝试更多地了解twisted 的内部结构(我认为了解twisted 的理念很好,对吧?)。学习这些东西的唯一方法是阅读源代码还是记录在某处?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2018-03-02
    • 2018-09-29
    相关资源
    最近更新 更多