繁体   English   中英

nats.io python客户端不会在关闭时刷新

[英]nats.io python client does not flush on close

我有一个leetle测试程序,除非我在client.close()之前执行client.flush() ,否则该程序无法工作。 天真地阅读nats / aio / client.py似乎表明close()了某种flush() ,所以我不明白为什么我的测试程序会失败。 是否有必要在close()之前总是flush() close()吗? 示例程序似乎并不表明这一点。

我可以看到close()调用_flush_pending() ,但这与flush()有所不同:

  • flush()调用_send_ping()发送PING并等待PONG响应。 _send_ping()直接写入self._io_writer ,然后调用_flush_pending()

  • _flush_pending()将None(我想会做任何事情_flush_pending()推入self._flush_queue 据推测,这会唤醒_flusher()并使它以self._pendingself._io_writer将所有内容写入self._io_writer

  • publish()调用_send_command()将消息推送到self._pending ,然后还调用_flush_pending()导致_flusher()编写所有内容。

测试程序:

#!/usr/bin/env python3.5

import asyncio
import nats.aio.client
import nats.aio.errors

async def send_message(loop):
    mq_url = "nats://nats:password@127.0.0.1:4222"
    client = nats.aio.client.Client()
    await client.connect(io_loop=loop, servers=[mq_url])
    await client.publish("test_subject", "test1".encode())
    #await client.flush()
    await client.close()

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(send_message(loop))
    loop.close()

if __name__ == '__main__':
    main()

FWIW,如果我发送了大量消息,那么在某个时候(尚未确定确切条件),将发送消息。 我们注意到在处理文件集合并为文件中的每一行发送消息时的行为:某些文件通过了,其他文件没有通过,结果是较大的文件(更多的行)才使它通过。 因此,似乎内部缓冲区已满,这将强制刷新。

看起来可能是一个已修复的错误: https : //github.com/nats-io/asyncio-nats/pull/35

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM