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"
詳細については、完全なエンドポイントのハウツーを参照してください。