繁体   English   中英

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

[英]Can multiple processes write to the same folder?

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

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

在linux上,打开文件(设置或不设置O_CREAT标志)是一个原子操作(参见例如此列表 )。 简而言之,只要您的进程使用不同的文件,您应该没有任何问题。

仅为您提供附加到文件的信息(最多为某个字节限制)也是原子的。 这篇文章很有意思。

这与Python完全无关,因为Python中的文件操作使用操作系统级系统调用(除非以root身份运行,否则您的Python程序无权执行原始设备写入并以root身份执行它们将非常愚蠢)。

一些文件系统理论,如果有人关心阅读:

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

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

您可能已经读过目录只是文件。 是的,它们是“文件”,其中包含文件列表(或实际上是树,但请不要将其与目录树混淆 - 它只是一种存储大型目录信息的机制,以便该目录中的文件可以不需要在目录条目中按顺序搜索)。 这是一个文件的原因是它是文件系统如何存储数据的机制。 不需要具有特定的数据存储机制,因为目录仅包含文件列表和指向其inode的指针。 您可以将其视为数据库,甚至更简单,即文本文件。 但最后它只是一个包含指针的文件,而不是在磁盘表面上分配的内容,以包含存储在目录中的实际文件。

那是背景。

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

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

它是操作系统和文件系统驱动程序的工作,以确保所有这一切始终发生。 实际上,它意味着文件系统驱动程序将操作排队。 同时将多个文件写入同一目录是一个例行操作 - 例如,当您浏览互联网时,Web浏览器缓存目录会以这种方式更新。 在引擎盖下,文件系统驱动程序对这些操作进行排队,并在开始处理以下操作之前为每个新文件完成步骤1-7。

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

您无需在应用程序级别担心这一点,因为操作系统的工作就是完成所有这些工作。

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

写入同一文件夹中的不同文件不会导致问题。 当然,文件夹是Linux中的文件,但是您打开文件而不是写入文件夹。

另一方面,根据您的日志大小,wiritng到具有多个进程的同一文件可能会导致问题。 有关更多详细信息,请参阅此问题: python日志记录是否支持多处理?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM