【发布时间】:2017-09-06 18:48:42
【问题描述】:
在多线程应用程序中,我有一种情况,我需要将一组日志消息(上限为 50K 日志消息)作为一个块一起编写,而不是逐个编写。
我不想在这里使用线程锁定(将我的块日志记录为关键部分),因为有明显的副作用,例如序列化,同步,这会降低性能。
为了避免同步,我正在考虑使用每个线程缓冲区,这样每个线程都将使用自己的缓冲区。它还将在使用缓冲区之前或之后清理它,即一旦将日志写入文件。
我正在考虑先将这些日志写入缓冲区,然后使用 python logger 的日志消息 API 将缓冲区写入日志文件
logger.info("Log message")
如果我认为日志消息的大小约为 50 字节,则此缓冲区的总大小为 2.5MBytes(50K x 50 字节)
我想了解 python 的记录器将如何处理这种大小的缓冲区?是否会影响性能?如果会,会以什么方式影响?
如果有其他 Python API 可用于支持此类日志记录,请告诉我。
【问题讨论】:
-
您的性能问题很难回答 - 记录器是否存在于它自己的线程或进程中?写入是否阻塞?目标是 SSD 驱动器上的本地文件,还是使用 SMTPHandler 之类的东西?
-
虽然它没有回答您的问题,但 logging.QueueHandler 和 QueueListener 旨在解决您正在谈论的那种问题:docs.python.org/3/library/…
-
嗨@DanielleM,记录器API由同一个线程调用,该线程将拥有并写入自己的缓冲区(它没有自己的进程)。是否写块——我认为它会,因为我正在使用“logging.handlers.RotatingFileHandler”。两个线程都将写入同一个日志文件。我没有使用 SSD。我现在主要关心的是 Python 记录器将如何对 2.5MB 缓冲区做出反应。会不会写成功,会不会有什么副作用。
-
@DanielleM。我会尝试 logging.QueueHandler 和 QueueListener,看看它是否能解决我的问题。从来没想过。
标签: python python-2.7 python-3.x logging