Twisted:如何在延迟子进程和HTTP请求之间通信?
背景:
我有一个运行很长时间的子进程,这个进程会不断生成新的进程。我对这个进程的协议进行了子类化,这样我就能知道何时收到标准输出、标准错误等信息。我希望能够通过共享变量、全局类或者其他方式,让不同的HTTP请求在一段时间内检查这些正在运行的进程的状态。
问题:
我该如何让子进程协议的事件监听器“放下”数据,以便后续的HTTP请求可以“捡起来”?
1 个回答
首先,创建一个“邮箱”对象;为了方便说明,我们可以把它想象成一个列表。这个“邮箱”也可以是字典、对象、文件或者数据库,随你喜欢,具体要看你的应用需求。
接着,当你创建你的 ProcessProtocol
时,把这个“邮箱”的引用传进去。当相关数据到达时,就用 self.mailbox.append(relevantData)
把数据添加到“邮箱”里。
同时,也把这个对象的引用传给处理这些请求的 HTTP 资源。然后在 render_GET
方法里,你可以用 relevantData = self.mailbox.pop()
来取出“邮箱”里的数据。
在 Twisted 中没有什么神奇的方法来做到这一点。这完全取决于你的应用的具体情况,以及你想如何存储和管理这些数据,而这些正是 Twisted 明确 不负责的。
你真正想问的问题其实就是:“我有一个对象 a
(你的进程协议),还有一个对象 b
(你的 HTTP 资源)。我该如何让 a
调用 b
的方法?” 这个常见问题 在 Twisted 社区中反复出现,但很难给出一个通用的答案,因为每个人都觉得自己在问不同的问题。
Twisted 实际上做的事情就是将你进程外部发生的事件(比如从子进程或网络到达的数据)映射到你进程中的方法调用上。你如何在内部安排这些对象,如何保持它们之间的引用,以及你如何处理 Twisted 刚给你的数据,完全由你决定。这种架构就是 Twisted 强大的原因。当你学会从回调中获取错误代码时,就是你该离开的时候了 :).