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

Eta*_*oin 5 python twisted perspective-broker

我在进程和子进程之间使用Twisted的Perspective Broker for RMI.

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

我找到了twisted.internet.stdio.StandardIO,但如果这是要走的路,我不知道如何设置一切.

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


等等,为什么?

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

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

Jea*_*one 10

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

StandardIO是第一件.你仍然需要第二块 - 那就是IReactorProcess.spawnProcess.

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

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

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

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

clientEndpoint.connect(factory)
Run Code Online (Sandbox Code Playgroud)

和你的服务器类似:

factory = PBServerFactory(...)
...
serverEndpoint.listen(factory)
Run Code Online (Sandbox Code Playgroud)

而且你现在有一个会互相交流的客户端和服务器,但你还没有明确说明他们如何相互交谈.也许它是TCP或者它的stdio.

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

clientEndpoint = ProcessEndpoint(reactor, "/path/to/child", ("argv",), ...)
serverEndpoint = StandardIOEndpoint(reactor)
Run Code Online (Sandbox Code Playgroud)

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

clientEndpoint = TCP4ClientEndpoint(reactor, "1.2.3.4", 12345)
serverEndpoint = TCP4ServerEndpoint(reactor, 12345)
Run Code Online (Sandbox Code Playgroud)

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

clientEndpoint = clientFromString(reactor, options["client-endpoint"])
serverEndpoint = serverFromString(reactor, options["server-endpoint"])
Run Code Online (Sandbox Code Playgroud)

哪里options["client-endpoint"]options["server-endpoint"]哪些字符串喜欢"tcp:host=1.2.3.4:port=12345""tcp:port=12345".

有关更多信息,请参阅完整的端点howto.