我在进程和子进程之间使用Twisted的透视代理。在
我宁愿使用子进程的stdin和stdout,而不是监听TCP套接字(例如通过传递reactor.listenTCP()
的实例)并让子进程连接到它。在
我已经找到了twisted.internet.stdio.StandardIO
,但如果是这样的话,我不确定如何设置所有的东西。在
在stdio上使用PB而不是TCP是否可行?怎样?在
子进程用于运行不受信任的代码。它是沙盒,但需要能够以有限的方式与父进程通信。某种形式的RMI是到目前为止针对特定用例的最干净的选择,而PB有一个看起来不错的访问模型。但是沙盒进程没有——也不应该需要——网络访问。RMI是它与外部世界唯一的通信方式,通过stdin/stdout传输它似乎是一种干净的商业方式。在
但如果我没有以正确的方式来做这件事,那也是一个非常有效的答案。在
在类stdio的连接上在父进程和子进程之间使用PB这样的协议有两个部分。一个部分在子进程中,使用文件描述符0和1与父进程通信。另一部分是父进程,使用与子进程的0和1相对应的任何文件描述符。在
StandardIO
是第一块。你还需要第二部分——那就是IReactorProcess.spawnProcess
。在然而,更新的端点api是访问此功能的更好方法。在
端点的基本原理是,客户端端点允许您连接到服务器,而不必关心该连接是如何建立的;而服务器端点允许您接受来自客户端的连接,而不必关心这些客户端是如何连接的。在
有一个子进程客户端终结点和一个stdio服务器终结点。这意味着你可以给你的客户写一些东西,比如:
你的服务器类似于:
^{pr2}$现在你有了一个客户端和服务器可以相互通信,但是你还没有真正指定它们是如何相互通信的。也许是TCP或者stdio。在
然后,您只需要选择要使用的右端点。要坚持通过stdio进行沟通的想法:
如果您稍后改变主意,那么切换到-say-TCP非常简单:
或者,您可以使用端点字符串描述的插件机制将其转换为配置:
其中}是类似于}的字符串。在
options["client-endpoint"]
和{"tcp:host=1.2.3.4:port=12345"
和{有关更多信息,请参见complete endpoints howto。在
相关问题 更多 >
编程相关推荐