背景:
我有一个长时间运行的扭曲生成的子进程。 我以这样一种方式对流程协议(protocol)进行了子类化,即当我收到 std out、std err 等时我会知道 我希望单独的 http 请求(在一系列时间)能够通过共享变量或全局类或其他东西检查这些正在运行的进程的状态。
问题:
我如何让子进程协议(protocol)的事件监听器“丢弃”数据,以便稍后的 http 请求“获取”。
最佳答案
创建一个“邮箱”对象;为了争论起见,假设它是一个列表。这可以是字典、对象、文件或数据库;无论你想要什么。适合您的应用程序的任何内容。
然后,当您实例化您的 ProcessProtocol
时,传递对邮箱的引用。当相关数据到达时,self.mailbox.append(relevantData)
。
此外,将对此对象的引用传递给响应这些请求的 HTTP 资源。然后,在 render_GET
中,relevantData = self.mailbox.pop()
。
在 Twisted 中没有神奇的方法可以做到这一点。这完全取决于您的应用程序的许多不同方面以及您希望存储和管理这些数据的方式,Twisted 明确不负责这些。
你在这里真正问的问题实际上只是归结为,“我有一个对象a
(你的进程协议(protocol))和一个对象b
(你的HTTP resource). How do I get a
to call a method on b
? This FAQ 以各种形式出现在Twisted社区中,一次又一次,但它非常很难写下一个很好的可重复使用的答案,因为每个人都认为他们在问不同的问题。
Twisted 正在做的事情 - 所有 Twisted 一直 正在做的,真的 - 是映射你的进程之外的事件发生 - 从子进程、网络到达的数据 -过程中的方法调用。如何在内部安排对象,如何保持它们之间的引用,以及如何处理 Twisted 刚刚提供给您的数据,完全取决于您。这种架构是 Twisted 如此强大的原因。当你学会从回调中抓取错误代码时,你就该离开了:)。
关于python - Twisted:在延迟的子进程和 http 请求之间进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892820/