代码描述:
我的代码很简单,它ZeroMQHandler
从 Logbook 库(使用 pyzmq)启动一个(基于套接字的消息传递)。Logger(日志)在整个应用程序中运行。最后,处理程序关闭端口。.push()
and.pop_application()
方法代替了and
with handler.applicationbound():
缩进。
目的:
我正在测试这个基于队列的消息传递,看看它是否可以成为低影响的异步日志记录解决方案。我需要每秒记录大约 15 000 条消息。我更喜欢使用 Python,但我的后备是用 C++ 编写记录器并将其句柄暴露给 python。
问题:
问题是,如果我在打开处理程序(套接字)后不等待四分之一秒或更长时间,程序将在没有任何消息通过的情况下执行(测试程序执行时间不到 0.25 秒)。我将此解释为 ZeroMQ 套接字或类似的东西所需的设置时间。所以我想看看是否有人有类似的经历,也许这在任何地方都有记录,但我自己似乎无法弄清楚。我想知道为什么需要这样做。感谢您的任何意见。
我的工作代码看起来像这样:
from logbook.queues import ZeroMQHandler
from logbook import Logger
import time
addr='tcp://127.0.0.1:5053'
handler = ZeroMQHandler(addr)
time.sleep(0.25) ################################################# THIS ! ####
log = Logger("myLogbook")
handler.push_application()
log.info("start of program")
foo()
log.info("end of program")
handler.close()
handler.pop_application()
接收器,在不同的 python 内核中运行(用于测试,向标准输出提供输出):
from logbook.queues import ZeroMQSubscriber
from logbook import Logger, StreamHandler
import sys
import time
addr='tcp://127.0.0.1:5053'
print("ZeroMQSubscriber begin with address {}".format(addr))
subscriber = ZeroMQSubscriber(addr)
handler = StreamHandler(sys.stdout)
log = Logger("A receiver")
handler.push_application()
try:
i=0
while True:
i += 1
record = subscriber.recv(2)
if not record:
pass # timeout
else:
print("got message!")
log.handle(record)
except KeyboardInterrupt:
print("C-C caught, program end after {} iterations".format(i))
handler.pop_application()