我正在使用 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 流水线或任何其他花哨的功能。