Python 通过TCP记录消息,明显慢于Java中的类似代码

Python 通过TCP记录消息,明显慢于Java中的类似代码,python,performance,sockets,logging,tcp,Python,Performance,Sockets,Logging,Tcp,在Python3中,我有一个连接到记录器的QueueHandler和一个将日志记录发送到SocketHandler的QueueListener,SocketHandler通过TCP将日志发送到正在侦听的Java应用程序 这两个程序都在本地主机上运行 import logging import queue log_q = queue.Queue(-1) logger = logging.getLogger('TestLogger') socket_handler = logging.handle

在Python3中,我有一个连接到记录器的QueueHandler和一个将日志记录发送到SocketHandler的QueueListener,SocketHandler通过TCP将日志发送到正在侦听的Java应用程序

这两个程序都在本地主机上运行

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()
我正在发送带有相当大的列表的日志记录

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个MSG,队列中仍有约700个MSG,在主程序完成后将缓慢发送

我使用的QueueHandler/-Listener是默认的,对默认SocketHandler的唯一更改是我使用了自定义序列化方法

我的目标(如果不是很明显的话)是尝试加快python代码的速度。不幸的是,我仍然不能100%确定是什么导致了这种缓慢的行为。这可能与套接字有关(我对套接字知之甚少,我尝试过使用各种超时设置和TCP_节点延迟,但没有效果)

我已经尝试放弃QueueHandler/-Listener,直接使用SocketHandler,这与之前花费的时间大致相同,因此我假设线程不是问题


非常感谢您提供有关问题可能是什么或如何加快此过程的任何提示。

对代码运行探查器以查看时间的进展情况。仅将套接字处理程序用于自定义序列化,然后再次使用默认序列化。你看到了什么不同?探查器真的没有那么大的帮助。它只是告诉我,程序花费了80%的运行时锁定线程,这有助于了解主程序完成后队列线程如何仍在运行以清除队列。除了lock.acquire()之外,探查器输出中没有其他值得注意的方法。我尝试了默认的序列化。它确实更快(17秒对27秒)。我在Java中使用了相同的自定义序列化程序(ProtoBuf),并且运行良好。我在Python中使用pyrobuf,这在过去对我很有用。但是,嘿,谢谢你的帮助,至少现在我知道它是ProtoBuf/PyroBuf。