を使用して、Python 3 で単純な RPC サーバーを作成していpycapnpます。完了するまでに約 1 秒かかる単一の関数呼び出しがあります。この関数は、キャッシュに格納されたデータも必要とします (現在は を使用して実装されていますlru-dict)。
単一のクライアントではすべてが正常に機能しますが、負荷を増やし始めるとすぐに、リクエストがキューイングを開始します (サーバーで実行されている関数内で測定されたウォール タイムは約 1 秒ですが、クライアントでは簡単に 10 秒以上を取得できます)。
私が知る限り、現在、pycapnp他のイベント ループはサポートされていません。
ThreadPoolExecutorサーバー実装の__init__メソッド (キャッシュも作成される) で を作成してから、RPC メソッドに以下を追加しようとしました。
capnp.Promise(self.executor.submit(long_running_function, request, cached_data).result()).\
then(lambda result: setattr(_context.results, 'response', result))
これが機能している間、メインスレッドは明らかにそれぞれPromiseが満たされるのを待っているようです。これは、クライアントがキューに入れなければならないことを意味します。
似たような状況にある人は、解決策を見つけましたか? 必ずしもを使用する必要はありませんpycapnpが、推奨される Cap'n Proto Python 実装 AFAICT です。
シリアル化してからソケット経由で送信する方が簡単ですか? Cap'n Proto RPC の promise パイプラインやその他の凝った機能は使用しません。