Twisted:如何在延迟子进程和HTTP请求之间通信?

4 投票
1 回答
1522 浏览
提问于 2025-04-16 11:11

背景:

我有一个运行很长时间的子进程,这个进程会不断生成新的进程。我对这个进程的协议进行了子类化,这样我就能知道何时收到标准输出、标准错误等信息。我希望能够通过共享变量、全局类或者其他方式,让不同的HTTP请求在一段时间内检查这些正在运行的进程的状态。

问题:

我该如何让子进程协议的事件监听器“放下”数据,以便后续的HTTP请求可以“捡起来”?

1 个回答

4

首先,创建一个“邮箱”对象;为了方便说明,我们可以把它想象成一个列表。这个“邮箱”也可以是字典、对象、文件或者数据库,随你喜欢,具体要看你的应用需求。

接着,当你创建你的 ProcessProtocol 时,把这个“邮箱”的引用传进去。当相关数据到达时,就用 self.mailbox.append(relevantData) 把数据添加到“邮箱”里。

同时,也把这个对象的引用传给处理这些请求的 HTTP 资源。然后在 render_GET 方法里,你可以用 relevantData = self.mailbox.pop() 来取出“邮箱”里的数据。

在 Twisted 中没有什么神奇的方法来做到这一点。这完全取决于你的应用的具体情况,以及你想如何存储和管理这些数据,而这些正是 Twisted 明确 不负责的。

你真正想问的问题其实就是:“我有一个对象 a(你的进程协议),还有一个对象 b(你的 HTTP 资源)。我该如何让 a 调用 b 的方法?” 这个常见问题 在 Twisted 社区中反复出现,但很难给出一个通用的答案,因为每个人都觉得自己在问不同的问题。

Twisted 实际上做的事情就是将你进程外部发生的事件(比如从子进程或网络到达的数据)映射到你进程中的方法调用上。你如何在内部安排这些对象,如何保持它们之间的引用,以及你如何处理 Twisted 刚给你的数据,完全由你决定。这种架构就是 Twisted 强大的原因。当你学会从回调中获取错误代码时,就是你该离开的时候了 :).

撰写回答