透视代理可以通过stdio而不是TCP使用吗?

2024-06-16 11:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在进程和子进程之间使用Twisted的透视代理。在

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

我已经找到了twisted.internet.stdio.StandardIO,但如果是这样的话,我不确定如何设置所有的东西。在

在stdio上使用PB而不是TCP是否可行?怎样?在


等等,为什么?在

子进程用于运行不受信任的代码。它是沙盒,但需要能够以有限的方式与父进程通信。某种形式的RMI是到目前为止针对特定用例的最干净的选择,而PB有一个看起来不错的访问模型。但是沙盒进程没有——也不应该需要——网络访问。RMI是它与外部世界唯一的通信方式,通过stdin/stdout传输它似乎是一种干净的商业方式。在

但如果我没有以正确的方式来做这件事,那也是一个非常有效的答案。在


Tags: 实例沙盒代理进程stdinstdout方式twisted
1条回答
网友
1楼 · 发布于 2024-06-16 11:56:10

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

StandardIO是第一块。你还需要第二部分——那就是IReactorProcess.spawnProcess。在

然而,更新的端点api是访问此功能的更好方法。在

端点的基本原理是,客户端端点允许您连接到服务器,而不必关心该连接是如何建立的;而服务器端点允许您接受来自客户端的连接,而不必关心这些客户端是如何连接的。在

有一个子进程客户端终结点和一个stdio服务器终结点。这意味着你可以给你的客户写一些东西,比如:

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

clientEndpoint.connect(factory)

你的服务器类似于:

^{pr2}$

现在你有了一个客户端和服务器可以相互通信,但是你还没有真正指定它们是如何相互通信的。也许是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"]和{}是类似于"tcp:host=1.2.3.4:port=12345"和{}的字符串。在

有关更多信息,请参见complete endpoints howto。在

相关问题 更多 >