多进程同时写一个日志文件,如何保证并发安全?

首先单条日志体积可能很大,短则 1 Bytes,多则 1024TB

我看到有些方式是使用文件锁,但是文件是一个很慢的东西,锁又是一个很慢的东西,把这两个很慢的东西结合在一起使用,那速度不是很感人吗?

用多进程就是为了快,但是现在又要引入文件锁,那不是又变成蜗牛了。

业内有什么『多进程同时写一个日志文件,如何保证并发安全?』优雅高效的解决方案吗?


比如 python 的一个日志组件: concurrent-log-handler 用的就是文件锁

Uses file locking to ensure exclusive write access Note: file locking is advisory, not a hard lock against external processes

但是我还看到了 python 的一个日志库: loguru,使用了一个 enqueue 的东西

enqueue (bool, optional) – Whether the messages to be logged should first pass through a multiprocess-safe queue before reaching the sink. This is useful while logging to a file through multiple processes. This also has the advantage of making logging calls non-blocking.

这个 enqueue 对应的好像就是 IPC 中的消息队列? 就是每个进程都往队列里面写 log,而不是直接写 fs。那么这个写 fs 的谁来做?有了解 loguru 这个机制的吗?或者其他语言中有类似的东西吗?有了解的可以讲讲吗?


回答:

就是加锁,这没啥好办法。

别的语言可能还需要在框架层面或者甚至业务层面去控制锁,像 Golang 这种语言的标准库里 log 模块就已经内置锁了 —— 还不是因为除了加锁就没啥好办法了么。

有瓶颈了先上 SSD。还有瓶颈再看怎么解决呗,一般就是异步落盘了(缺点是可能有部分数据丢失),比如先统一放到一个队列或者管道里、交由一个进程负责写,或者是上 Socket 往专门的日志服务里写了。你能看到的所谓“无锁日志”其实都是异步的。

要是还不能接受的话那就只能是各自写各自的、互不干扰咯。


【针对问题补充】

这就是我说的异步落盘,先往队列里写。

简单看了下 loguru 的源码其实还是有锁,队列本身是要锁来保证安全的,用的是 multiprocessing 模块,但这起码比文件锁轻量了不止一点儿半点儿不是?

队列里怎么落盘的相关源码在这里:https://github.com/Delgan/log...

至于语言层面很少有这东西吧,这都是库或框架干的事儿了。比如 Java 的 Log4j 也支持异步落盘,有 AsyncAppender/AsyncLogger。


回答:

专门去看了一下loguru. 在初始化Handler时,启动了一个daemon线程。在具体写数据时,也会加锁 见_locks_machinery.py

https://github.com/Delgan/loguru/blob/8c96b6227f/loguru/_handler.py#L91

多进程同时写一个日志文件,如何保证并发安全?


单条日志1024TB是什么概念。硬盘写入速度就算1TB/s,那也要1024s = 17分钟...


已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。


回答:

根据loguru的源码,他们用的是multiprocessing里的SimpleQueue:

        if self._enqueue:

self._queue = multiprocessing.SimpleQueue()

self._confirmation_event = multiprocessing.Event()

self._confirmation_lock = multiprocessing.Lock()

self._owner_process_pid = os.getpid()

self._thread = Thread(

target=self._queued_writer, daemon=True, name="loguru-writer-%d" % self._id

)

self._thread.start()


已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

以上是 多进程同时写一个日志文件,如何保证并发安全? 的全部内容, 来源链接: utcz.com/p/938462.html

回到顶部