我正在使用pycapnp
在Python 3中编写一个简单的RPC服务器。我有一个函数调用需要大约一秒钟才能完成。此功能还需要存储在缓存中的数据(目前使用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&#Proto Python实施AFAICT。
序列化然后简单地通过套接字发送会更简单吗?我没有在Cap&n Proto RPC中使用承诺流水线或任何其他奇特的功能。