我编写了一个简短的python NATS客户端,该客户端订阅了某个主题,然后向gNATSd最终发布了“ n”个请求,最终发布给了用C编写的NatsClient。此C NatsClient然后回复提到的“回复主题”在publish_request调用中。我看到的问题是:所有publish_requests都非常迅速地从python Natsclient发送到gNATSd,然后又发送到C Natsclient,但是响应时间很长。我确定这里的瓶颈在代码的订阅和response_handle部分中,而不在发送响应的C Natsclient中。这是代码片段:
def connect(self):
self.loop.run_until_complete(self.nc.connect(servers=["nats://localhost:4222"]))
def disconnect(self):
return self.loop.run_until_complete(self.nc.close())
def send(self, request_number):
self.loop.run_until_complete(self.pub())
def recv(self):
self.loop.run_until_complete(self.sub())
def wait_for_msg(self):
self.loop.run_until_complete(self.wait())
async def pub(self):
await self.nc.publish_request(self.subject, self.reply, json.dumps(self.data1).encode())
async def sub(self):
async def response_handle(msg):
message = json.loads(msg.data.decode())
self.msgs.append(message)
#self.future.set_result(message)
await self.nc.subscribe(self.reply, cb = response_handle)
async def wait(self):
try:
msg = await asyncio.wait_for(self.future, 1)
except asyncio.TimeoutError:
print("NATS: No more messages to receive exiting")
按以下顺序调用这些方法:
def send_recv(self):
self.nats.recv()
for i in range(100):
self.nats.send()
self.nats.wait_for_msg()
def run(self):
self.nats.connect()
t = time.time()
self.send_recv()
self.nats.flush_nats()
total_time = time.time() - t
self.nats.print()
print ("Time taken:", total_time)
此外,总体观察是,在将响应数从100增加到10000时,我看到程序仅接收到少量响应并引发异常“ NATS:没有更多消息要接收退出”后退出。但是,如果我将超时值提高到一个更大的数字:await asyncio.wait_for(self.future,1),我的确会得到所有响应。
有人可以建议可以采取哪些措施来减少处理所有这些请求的时间。