我在Ubuntu机器上运行Python中的几个进程(使用multiprocessing.Process)。 每个进程都写入各种临时文件。每个进程都写入不同的文件,但所有文件都在同一个文件夹中。 这里有潜在的错误风险吗?
我认为可能存在问题的原因是,AFAIK,Unix中的文件夹只是一个文件。因此,它会像几个进程同时写入同一个文件一样,这可能会导致信息丢失。 这真的是潜在的风险吗?如果是这样,如何解决?
答案 0 :(得分:2)
在linux上,打开一个文件(设置或不设置O_CREAT
标志)是一个原子操作(参见例如this list)。简而言之,只要您的进程使用不同的文件,您应该没有任何问题。
仅为您提供附加到文件的信息(最多为某个字节限制)也是原子的。 This article在这方面很有意思。
答案 1 :(得分:1)
这与Python完全无关,因为Python中的文件操作使用操作系统级系统调用(除非以root身份运行,否则您的Python程序无权执行原始设备写入并以root身份执行它们将是非常愚蠢的)。
如果有人愿意阅读,可以使用一些文件系统理论:
是的,如果您研究文件系统架构以及数据实际存储在驱动器上的方式,则文件和目录之间存在相似之处 - 但仅限于数据存储级别。原因是没有必要将这两者分开。例如,ext4文件系统具有存储关于文件(元数据)的信息的方法,存储在称为inode的小单元中,以及实际文件本身。 Inode包含指向可以找到文件数据的实际磁盘空间的指针。
文件系统通常与目录无关。文件系统基本上就是这样:它包含有关可用磁盘空间的信息,有关指向数据的文件的信息以及实际数据。元数据的一部分是文件所在的目录。在现代文件系统中(古代FAT是仍在使用的例外)磁盘上的数据存储与目录无关。目录用于允许人和计算机实现文件系统快速定位文件和文件夹,而不是顺序遍历inode列表,直到找到正确的文件。
您可能已经读过目录只是文件。是的,他们是"文件"其中包含文件列表(或实际上是树,但请不要将其与目录树混淆 - 它只是一种存储大型目录信息的机制,因此不需要在内部顺序搜索该目录中的文件目录条目)。这是一个文件的原因是它是文件系统如何存储数据的机制。不需要具有特定的数据存储机制,因为目录仅包含文件列表和指向其inode的指针。您可以将其视为数据库,甚至更简单,即文本文件。但最后它只是一个包含指针的文件,而不是在磁盘表面上分配的内容,以包含存储在目录中的实际文件。
那是背景。
您计算机上的文件系统实现只是一个知道如何处理所有这些的软件。当您在某个目录中打开文件进行写入时,通常会发生以下情况:
它是操作系统和文件系统驱动程序的工作,以确保所有这一切始终发生。实际上,它意味着文件系统驱动程序将操作排队。同时将多个文件写入同一目录是一个例行操作 - 例如,当您浏览互联网时,Web浏览器缓存目录会以这种方式更新。在引擎盖下,文件系统驱动程序对这些操作进行排队,并在开始处理以下操作之前为每个新文件完成步骤1-7。
为了使它更复杂,有一个日志充当中间缓冲区。您的事务被写入日志,当文件系统空闲时,文件系统驱动程序将日志事务提交到实际存储空间,但理论保持不变。这是性能和可靠性问题。
您无需在应用程序级别担心这一点,因为操作系统的工作就是完成所有这些工作。
相反,如果您在同一目录中创建了大量随机命名的文件,理论上如果您的随机名称生成器生成两个相同的文件名,则可能会在某些时候发生冲突。有一些方法可以缓解这种情况,这将是您在应用程序中需要担心的部分。但是比这更重要的是操作系统的任务。
答案 2 :(得分:0)
写入同一文件夹中的不同文件不会导致问题。当然,文件夹是Linux中的文件,但是您打开文件而不是写文件夹。
另一方面,根据您的日志大小,wiritng到具有多个进程的同一文件可能会导致问题。有关详细信息,请参阅此问题:Does python logging support multiprocessing?