[英]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._pending
的self._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.