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.