Python 透视代理可以通过stdio而不是TCP使用吗?
我使用Twisted的透视代理在流程和子流程之间进行RMI 我宁愿使用子进程的stdin和stdout,而不是侦听TCP套接字(例如通过传递Python 透视代理可以通过stdio而不是TCP使用吗?,python,twisted,perspective-broker,Python,Twisted,Perspective Broker,我使用Twisted的透视代理在流程和子流程之间进行RMI 我宁愿使用子进程的stdin和stdout,而不是侦听TCP套接字(例如通过传递reactor.listenTCP()PBServerFactory的实例)并让子进程连接到它 我发现twisted.internet.stdio.StandardIO,但如果是这样的话,我不知道如何设置一切 在stdio上使用PB而不是TCP是否可行?怎么做 等等,为什么? 子进程用于运行不受信任的代码。它是沙盒式的,但需要能够以有限的方式与父进程通信。
reactor.listenTCP()
PBServerFactory的实例)并让子进程连接到它
我发现twisted.internet.stdio.StandardIO,但如果是这样的话,我不知道如何设置一切
在stdio上使用PB而不是TCP是否可行?怎么做
等等,为什么? 子进程用于运行不受信任的代码。它是沙盒式的,但需要能够以有限的方式与父进程通信。某种形式的RMI是到目前为止针对特定用例最干净的选择,PB有一个看起来正确的访问模型。但是沙盒进程没有——也不应该需要——网络访问。RMI是其与外部世界的唯一通信,通过stdin/stdout进行传输似乎是一种干净的业务方式
但是,如果我没有用正确的方法来解决这个问题,这也是一个完全正确的答案。在类似stdio的连接上,在父进程和子进程之间使用类似PB的协议有两个部分。子进程中有一个片段,使用文件描述符0和1与父进程通信。另一部分是父进程,使用与子进程的0和1相对应的任何文件描述符
StandardIO
是第一件。您仍然需要第二部分,即IReactorProcess.spawnProcess
但是,较新的端点API是访问此功能的更好方法
端点的基础是,客户端端点允许您连接到服务器,而不必关心连接是如何建立的;服务器端点允许您接受来自客户端的连接,而不必关心这些客户端是如何连接的
有一个子进程客户端终结点和一个stdio服务器终结点。这意味着您可以编写类似以下内容的客户端:
factory = PBClientFactory(...)
d = factory.getRootObject()
...
clientEndpoint.connect(factory)
factory = PBServerFactory(...)
...
serverEndpoint.listen(factory)
您的服务器类似于:
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)
如果您以后改变主意,那么切换到-say-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”
的字符串
有关更多信息,请参阅