1

我正在使用 Python 3 编写一个简单的 RPC 服务器pycapnp。我有一个函数调用大约需要一秒钟才能完成。此功能还需要将数据存储在缓存中(当前使用 实现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 流水线或任何其他花哨的功能。

4

0 回答 0