5

プロセスとサブプロセスの間の RMI に Twisted の Perspective Broker を使用しています。

reactor.listenTCP()(のインスタンスを渡すなどしてPBServerFactory) TCP ソケットをリッスンし、サブプロセスをそれに接続させるよりも、サブプロセスの stdin と stdout を使用することをお勧めします。

を見つけましたがtwisted.internet.stdio.StandardIO、それでよいのであれば、すべてを設定する方法がわかりません。

TCP の代わりに PB over stdio を使用することは可能ですか? どのように?


待って、なぜ?

サブプロセスは、信頼できないコードを実行するためのものです。サンドボックス化されていますが、限られた方法で親プロセスと通信できる必要があります。RMI の何らかの形式は、特定のユース ケースに対して最もクリーンなオプションであり、PB には適切に見えるアクセス モデルがあります。しかし、サンドボックス化されたプロセスには、ネットワーク アクセスがありません (また、その必要もないはずです)。その RMI は外部世界との唯一の通信であり、stdin/stdout を介してパイプすることは、ビジネスを行うためのクリーンな方法のように思えます。

しかし、私がこれを正しい方法で行っていない場合、それも完全に有効な答えです.

4

1 に答える 1

10

stdio のような接続を介して親プロセスと子プロセスの間で PB のようなプロトコルを使用するには、2 つの部分があります。1 つは子プロセスにあり、ファイル記述子 0 と 1 を使用して親と通信します。もう 1 つは親プロセスで、子プロセスの 0 と 1 に対応するファイル記述子を使用します。

StandardIOは最初の作品です。まだ 2 番目のピースが必要です。それはIReactorProcess.spawnProcess.

ただし、新しいエンドポイントAPI は、この機能にアクセスするための優れた方法です。

エンドポイントの基本は、クライアント エンドポイントを使用すると、接続の確立方法を正確に気にせずにサーバーに接続でき、サーバー エンドポイントを使用すると、クライアントの接続方法を正確に気にせずにクライアントからの接続を受け入れることができるということです。

子プロセス クライアント エンドポイントと stdio サーバー エンドポイントがあります。これは、クライアントを次のように記述できることを意味します。

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)

後で気が変わった場合、たとえば 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"

詳細については、完全なエンドポイントのハウツーを参照してください。

于 2013-05-20T11:58:16.447 に答える