在多处理环境中使用时文件追加的限制
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
,到Python
,Fortran
.. . 就我而言,它是一个 C++ 项目,不幸的是这种方法不起作用。必须有非 IPC 解决方案以上是关于在多处理环境中使用时文件追加的限制的主要内容,如果未能解决你的问题,请参考以下文章
无法覆盖 UAT 配置文件环境中的 Tomcat 默认文件大小限制
C#多线程环境下调用 HttpWebRequest 并发连接限制