在多处理环境中使用时文件追加的限制

Posted

技术标签:

【中文标题】在多处理环境中使用时文件追加的限制【英文标题】:Limitations on file append when using in multi-processed environment 【发布时间】:2021-06-11 12:13:42 【问题描述】:

我的进程创建了一个日志文件,并使用a在文件末尾追加了一个新行,例如:

fopen("log.txt", "a");

写入的顺序并不重要,但我需要确保fopen 始终成功。我的问题是,上面的调用可以在 Windows、Linux 和 macOS 上同时从多个进程执行而没有任何竞争条件吗?

如果不是,那么确保我可以写入日志文件的最常见和最简单的方法是什么?有文件锁定,但也可能有文件锁定(又名 log.txt.lock)。谁能分享一些更详细的见解或资源?

【问题讨论】:

【参考方案1】:

如果您在进程之间不使用任何同步,您很可能会遇到多个进程尝试写入文件的情况,而您可以获得的最佳结果是输入字符串的网格。

为了同步多个进程中的任何工作(multiprocessing 模块)。使用Lock。它会阻止多个进程同时做一些工作。

它看起来像这样:

import multiprocessing

# create lock in main process and "send" it to child processes.
lock = multiprocessing.Lock() 

# ...
# in child Process
with lock:
    do_some_work()

如果您需要更详细的示例,请随时提出。

您也可以查看official docs中的示例

【讨论】:

感谢您的回答!我也想到了一个锁,但是进程是在终端中独立运行的 @HelloWorld 如果你有几个独立的进程,你可以尝试使用像 RabbitMQ 这样的消息队列或者更轻的东西。消息队列保证日志将被写入磁盘,并且任务将按照它们进入队列的顺序写入(如果没有优先级)或者您可以基于套接字执行您的操作 - 一个进程将是“日志文件写入器”,其他进程将通过套接字向进程发送数据。 很遗憾,我的项目不是 Python 项目,我会看看我在其他框架中能做什么。感谢分享! @HelloWorld 如果你的项目是 php 的(对不起,如果我错了,只是用谷歌搜索了 fopen 函数)你仍然可以使用 RabbitMQ rabbitmq.com/tutorials/tutorial-one-php.html 如果你有很多独立的进程,这是一个很好的生产级服务/微服务相互交互。 感谢您查找,但fopen 非常标准,几乎无处不在,从C,到C++PHP,到PythonFortran.. . 就我而言,它是一个 C++ 项目,不幸的是这种方法不起作用。必须有非 IPC 解决方案

以上是关于在多处理环境中使用时文件追加的限制的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在java中将特定数量的线程限制为同步块

无法覆盖 UAT 配置文件环境中的 Tomcat 默认文件大小限制

解决wordpress上传文件2M限制

C#多线程环境下调用 HttpWebRequest 并发连接限制

多线程环境下调用 HttpWebRequest 并发连接限制

在多故事板应用程序中将支持的方向限制为特定故事板[关闭]