Python NATS客户端无法实现所需的性能

时间:2019-03-07 20:15:00

标签: python-3.x nats.io

我编写了一个简短的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),我的确会得到所有响应。

有人可以建议可以采取哪些措施来减少处理所有这些请求的时间。

0 个答案:

没有答案