在Python 3中,我将QueueHandler附加到Logger,QueueListener将LogRecords发送到SocketHandler,后者通过TCP将日志发送到正在监听的Java应用程序。
两个程序都在localhost上运行。
import logging
import queue
log_q = queue.Queue(-1)
logger = logging.getLogger('TestLogger')
socket_handler = logging.handlers.SocketHandler('localhost', 1337)
q_handler = logging.handlers.QueueHandler(log_q)
q_listener = logging.handlers.QueueListener(log_q, socket_handler)
logger.addHandler(q_handler)
q_listener.start()
我发送带有相当大的列表的LogRecords。
logger.info("PROX_MARKER", extra={'vector': [some_list]})
其中[some_list]
是~100k双值的列表。
我运行以下代码来测试吞吐量:
for i in range(1000):
logger.info("PROX_MARKER", extra={'vector': [some_list]})
完成大约需要30-35秒。
如果我在Java中运行类似的测试,Java应用程序的速度大约是其两倍。
在Python中,QueueHandler / -Listener + SocketHandler设置为队列中每10次放置设置发送大约3条消息。当程序完成时,它已经发送了~300个消息,大约700个仍然在队列中,这将比主程序已经完成后慢慢发送。
我使用的QueueHandler / -Listener是默认的,对默认SocketHandler的唯一更改是我使用自定义序列化方法。
我的目标(如果这不明显)是尝试加速python代码。不幸的是,我仍然不能100%确定导致这种缓慢行为的原因。它可能与套接字有关(我知道的很少,我已尝试使用各种超时设置和TCP_NODELAY - 无济于事)。
我试图抛弃QueueHandler / -Listener并直接使用SocketHandler,它花费的时间与以前相同,所以我假设线程不是问题。< / p>
非常感谢任何关于问题可能是什么或如何加快速度的提示。