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

时间:2017-05-03 01:30:11

标签: python nats.io

我有一个leetle测试程序,除非我在client.flush()之前执行client.close(),否则它无效。对nats/aio/client.py的天真解读似乎表明close()会执行某种flush(),所以我不明白为什么我的测试程序会失败。是否有必要在flush()之前始终close()?示例程序似乎并不表示如此。

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

  • flush()致电_send_ping()发送PING并等待PONG回复。 _send_ping()直接写入self._io_writer,然后拨打_flush_pending()

  • _flush_pending()将一个无(我想做的任何事情)推送到self._flush_queue。这可能会唤醒_flusher()并导致它在self._pendingself._io_writer中写下所有内容。

  • publish()调用_send_command()将消息推送到self._pending,然后调用_flush_pending()以使_flusher()写入所有内容。< / p>

测试程序:

#!/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如果我发送了大量消息,那么在某些时候(尚未确定具体条件),就会发送消息。我们注意到处理文件集合并为文件中的每一行发送消息时的行为:有些文件正在通过,有些文件没有通过,结果发现它是更大的文件(更多行)它。所以看起来好像有一些内部缓冲区被填满,这会强制刷新。

1 个答案:

答案 0 :(得分:0)

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