代码描述:
我的代码很简单,它启动了一个基于socket的消息处理器
目的: 我正在测试这种基于队列的消息传递,看它是否可以成为一种低影响力的异步日志记录解决方案。 我需要每秒记录大约15,000条消息。 我更喜欢使用Python,但如果不行的话,我就会在C ++中编写记录器并将其句柄公开给Python。
问题: 问题在于,如果我在打开处理器(socket)后不等待四分之一秒或更长时间,程序就不会执行任何消息(测试程序执行时间小于0.25秒)。我认为这是ZeroMQ套接字或类似的东西所需的设置时间。因此,我想知道是否有人有类似的经验,也许这在任何地方都有记录,但我自己似乎无法弄清楚。我想知道为什么需要这样做。 谢谢任何帮助。
我的工作代码如下:
ZeroMQHandler
(使用pyzmq库中的Logbook)。记录器(log)贯穿整个应用程序。最后,处理器关闭端口。而.push()
和.pop_application()
方法代替了with handler.applicationbound():
和缩进。目的: 我正在测试这种基于队列的消息传递,看它是否可以成为一种低影响力的异步日志记录解决方案。 我需要每秒记录大约15,000条消息。 我更喜欢使用Python,但如果不行的话,我就会在C ++中编写记录器并将其句柄公开给Python。
问题: 问题在于,如果我在打开处理器(socket)后不等待四分之一秒或更长时间,程序就不会执行任何消息(测试程序执行时间小于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()