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