首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多个进程可以写入同一个文件夹吗?

多个进程可以写入同一个文件夹吗?
EN

Stack Overflow用户
提问于 2018-01-10 15:50:33
回答 3查看 2.1K关注 0票数 1

我在Ubuntu机器上使用Python (使用multiprocessing.Process)运行了几个进程。每个进程都写入各种临时文件。每个进程写入不同的文件,但所有文件都位于同一个文件夹中。这里有潜在的错误风险吗?

我认为可能存在问题的原因是,AFAIK,Unix中的文件夹只是一个文件。因此,jsut就像几个进程同时写入同一个文件一样,这可能会导致信息丢失。这真的是潜在的风险吗?如果是的话,如何解决?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-10 16:50:51

这与Python完全无关,因为Python中的文件操作使用OS级别的系统调用(除非以root方式运行,否则Python程序将没有权限进行原始设备写入,并且将它们作为root操作将非常愚蠢)。

如果有人想读的话,请读一点文件系统理论:

是的,如果您研究文件系统架构和数据如何实际存储在驱动器上,那么文件和目录之间就有相似之处--但仅限于数据存储级别。原因是没有必要把这两者分开。例如,ext4文件系统有一种存储文件(元数据)信息的方法,它存储在称为inode的小单元中,以及实际文件本身。Inode包含指向可以找到文件数据的实际磁盘空间的指针。

文件系统通常对目录是不可知的。文件系统基本上就是这样的:它包含关于空闲磁盘空间的信息,关于带有指向数据的指针的文件的信息,以及实际的数据。元数据的一部分是文件所在的目录。在现代文件系统中(古老的FAT是仍在使用的例外)磁盘上的数据存储与目录无关。目录用于使实现文件系统的人和计算机快速定位文件和文件夹,而不是依次遍历inode列表,直到找到正确的文件。

您可能已经读到目录只是文件。是的,它们是包含文件列表(或者实际上是一棵树)的“文件”,但请不要将其与目录树混淆--它只是一种存储有关大目录的信息的机制,这样该目录中的文件就不需要在目录条目中按顺序进行搜索)。之所以这是一个文件,是因为它是文件系统存储数据的机制。不需要有特定的数据存储机制,因为目录只包含文件列表和指向它们的节点的指针。你可以把它想象成一个数据库,或者更简单的,一个文本文件。但最终,它只是一个包含指针的文件,而不是在磁盘表面分配以包含存储在目录中的实际文件的文件。

这就是背景。

您的计算机上的文件系统实现只是一个软件,它知道如何处理所有这些问题。当您在某个目录中打开一个用于写入的文件时,通常会发生这样的情况:

  1. 找到一个免费的inode,并在那里创建一个条目。
  2. 查询空闲群集/块数据库,以查找文件内容的存储空间。
  3. 在该数据库中存储文件数据,并将块/群集标记为“正在使用”。
  4. 更新Inode以包含文件元数据和指向此磁盘空间的指针。
  5. 包含目标目录的目录数据的"File“位于
  6. 对此文件进行修改,以便添加一条记录。此记录有一个指向刚刚创建的inode的指针,以及文件名。
  7. 文件的Inode也被更新为包含指向该目录的链接。

它是操作系统和文件系统驱动程序的工作,以确保所有这些都是一致的。在实践中,它意味着文件系统驱动程序队列操作。将多个文件同时写入同一个目录是一项例行操作--例如,当您浏览internet时,web浏览器缓存目录就会以这种方式得到更新。在遮罩下,文件系统驱动程序对这些操作进行排队,并在开始处理以下操作之前对每个新文件完成步骤1-7。

为了使它更加复杂,有一个日志充当中间缓冲区。您的事务被写入日志,当文件系统空闲时,文件系统驱动程序将日志事务提交到实际存储空间,但理论上保持不变。这是一个性能和可靠性问题。

您不需要在应用程序级别上担心这一点,因为所有这些都是操作系统的工作。

相反,如果在同一个目录中创建大量随机命名的文件,理论上,如果随机名称生成器生成两个相同的文件名,理论上可能会发生冲突。有一些方法可以缓解这种情况,这将是您在应用程序中需要担心的部分。但是,任何更深层次的事情都是操作系统的任务。

票数 2
EN

Stack Overflow用户

发布于 2018-01-10 16:01:45

在linux上,打开一个文件(不管是否设置了O_CREAT标志)是一个原子操作(例如,请参见这份清单)。简而言之,只要您的进程使用不同的文件,您就不会有任何麻烦。

对于您来说,附加到文件中的信息(直到某个字节限制)也是原子的。这篇文章在这方面很有趣。

票数 2
EN

Stack Overflow用户

发布于 2018-01-10 16:29:59

在同一个文件夹中写入不同的文件不会造成问题。当然,在Linux中,文件夹是一个文件,但您打开该文件是为了编写该文件夹,而不是该文件夹。

另一方面,使用多个进程处理同一个文件可能会导致问题,这取决于您的日志大小。有关详细信息,请参阅此问题:python日志记录支持多处理吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48191238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档