可以在stdio而不是TCP上使用Perspective Broker吗?

时间:2013-05-20 03:57:37

标签: python twisted perspective-broker

我在进程和子进程之间使用Twisted的Perspective Broker进行RMI。

不是监听TCP套接字(例如通过传递reactor.listenTCP() PBServerFactory的实例)并让子进程连接到它,我更喜欢使用子进程' s stdin和stdout。

我找到了twisted.internet.stdio.StandardIO,但如果这样,那我就不知道如何设置一切。

使用PB over stdio而不是TCP是否可行?怎么样?


等等,为什么?

子进程用于运行不受信任的代码。它是沙箱,但需要能够以有限的方式与父进程进行通信。到目前为止,某种形式的RMI是特定用例的最干净选项,PB具有看起来正确的访问模型。但沙盒化过程并不具备 - 并且不应该 - 网络访问。 RMI是它与外部世界的唯一沟通,通过stdin / stdout进行管理似乎是一种干净的经营方式。

但如果我没有以正确的方式解决这个问题,那也是一个非常有效的答案。

1 个答案:

答案 0 :(得分:9)

在类似stdio的连接上使用父级和子级进程之间的PB之类的协议有两个部分。一件是在子进程中,使用文件描述符0和1与父进程通信。另一部分是父进程,使用对应于子0和1的任何文件描述符。

StandardIO是第一部。你还需要第二块 - 那是IReactorProcess.spawnProcess

但是,较新的端点 API是访问此功能的更好方式。

端点的基础是客户端端点允许您连接到服务器而无需确切地了解如何建立连接,并且服务器端点允许您接受来自客户端的连接没有关心这些客户的连接方式。

有一个子进程客户端端点和一个stdio服务器端点。这意味着您可以为客户编写如下内容:

factory = PBClientFactory(...)
d = factory.getRootObject()
...

clientEndpoint.connect(factory)

你的服务器就像:

factory = PBServerFactory(...)
...
serverEndpoint.listen(factory)

现在你有一个会互相交流的客户端和服务器,但你还没有实际指定他们如何相互交谈。也许它是TCP或者也许是stdio。

然后您只需要选择正确的端点即可使用。坚持你通过stdio沟通的想法:

clientEndpoint = ProcessEndpoint(reactor, "/path/to/child", ("argv",), ...)
serverEndpoint = StandardIOEndpoint(reactor)

如果您稍后改变主意,那么切换到 - 比如说 - TCP就像以下一样简单:

clientEndpoint = TCP4ClientEndpoint(reactor, "1.2.3.4", 12345)
serverEndpoint = TCP4ServerEndpoint(reactor, 12345)

或者您可以使用插件机制对端点的字符串描述将其转换为配置:

clientEndpoint = clientFromString(reactor, options["client-endpoint"])
serverEndpoint = serverFromString(reactor, options["server-endpoint"])

其中options["client-endpoint"]options["server-endpoint"]"tcp:host=1.2.3.4:port=12345""tcp:port=12345"等字符串。

有关详情,请参阅complete endpoints howto