代码描述:
我的代码很简单,它从日志库(使用PYZMQ(启动 ZeroMQHandler
(基于套接字的消息传递(。记录器(日志(在整个应用程序中运行。最后,处理程序关闭了港口。 .push()
和 .pop_application()
方法在那里而不是
with handler.applicationbound():
和缩进。
目的:
我正在测试这个基于队列的消息传递,以查看它是否可以是低影响的异步记录解决方案。我需要每秒记录约15000条消息。我更喜欢使用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()
Zeromq确实花了一些时间来创建 Context()
-insance per-se,然后要求O/s分配内存的资源,以产生I///O-Threads,这还需要额外的时间。接下来,每个 Socket()
- 构造会消耗一些附加开销时间。
在本机API文件和教育资源中,它都有充分的记录,在任何API重复实际上都在"本地"one_answers"远程" Context()
-中都经过处理之前,异步信号/消息传递框架确实会花费一些时间。实例,最终标记为"远程"的可读性 - Zeromq一些可扩展的正式通信原型。
这就是说,不足为奇的是,更不包装Zeromq工具(由另一个级别的抽象重新包装,编码为 logbook.queue.ZeroMQSubscriber, logbook.queue.ZeroMQHandler
类(,只会添加附加{
设置&操作}
-跨头,因此该服务的已知异步性只会增长。
如果您的应用程序需要在达到 r eady- t o- o- o perate状态( rto -State(,最好的是介绍某种智能回归政策,而不是保持盲目的信念,依靠足够长的.sleep()
来希望事情是让足够的时间安定下来并进入RTO。
在分布式系统中,总是有更好的明确,而不是保持乐观的希望。
结语:
鉴于您持续的吞吐量应安全地陷入困境,并且在 <= 66 [us/message]
的预期阈值下,每个消息都会分发,让我也将利息提高到适当的 Context()
-parametrication-parametrication,以便在逼真的硬件和全系统资源计划下确实可以顺利进行所需的工作量。
默认值不会被锤成石头,也不应该依靠。