我在Ubuntu机器上使用Python (使用multiprocessing.Process)运行了几个进程。每个进程都写入各种临时文件。每个进程写入不同的文件,但所有文件都位于同一个文件夹中。这里有潜在的错误风险吗?
我认为可能存在问题的原因是,AFAIK,Unix中的文件夹只是一个文件。因此,jsut就像几个进程同时写入同一个文件一样,这可能会导致信息丢失。这真的是潜在的风险吗?如果是的话,如何解决?
发布于 2018-01-10 16:50:51
这与Python完全无关,因为Python中的文件操作使用OS级别的系统调用(除非以root方式运行,否则Python程序将没有权限进行原始设备写入,并且将它们作为root操作将非常愚蠢)。
如果有人想读的话,请读一点文件系统理论:
是的,如果您研究文件系统架构和数据如何实际存储在驱动器上,那么文件和目录之间就有相似之处--但仅限于数据存储级别。原因是没有必要把这两者分开。例如,ext4文件系统有一种存储文件(元数据)信息的方法,它存储在称为inode的小单元中,以及实际文件本身。Inode包含指向可以找到文件数据的实际磁盘空间的指针。
文件系统通常对目录是不可知的。文件系统基本上就是这样的:它包含关于空闲磁盘空间的信息,关于带有指向数据的指针的文件的信息,以及实际的数据。元数据的一部分是文件所在的目录。在现代文件系统中(古老的FAT是仍在使用的例外)磁盘上的数据存储与目录无关。目录用于使实现文件系统的人和计算机快速定位文件和文件夹,而不是依次遍历inode列表,直到找到正确的文件。
您可能已经读到目录只是文件。是的,它们是包含文件列表(或者实际上是一棵树)的“文件”,但请不要将其与目录树混淆--它只是一种存储有关大目录的信息的机制,这样该目录中的文件就不需要在目录条目中按顺序进行搜索)。之所以这是一个文件,是因为它是文件系统存储数据的机制。不需要有特定的数据存储机制,因为目录只包含文件列表和指向它们的节点的指针。你可以把它想象成一个数据库,或者更简单的,一个文本文件。但最终,它只是一个包含指针的文件,而不是在磁盘表面分配以包含存储在目录中的实际文件的文件。
这就是背景。
您的计算机上的文件系统实现只是一个软件,它知道如何处理所有这些问题。当您在某个目录中打开一个用于写入的文件时,通常会发生这样的情况:
它是操作系统和文件系统驱动程序的工作,以确保所有这些都是一致的。在实践中,它意味着文件系统驱动程序队列操作。将多个文件同时写入同一个目录是一项例行操作--例如,当您浏览internet时,web浏览器缓存目录就会以这种方式得到更新。在遮罩下,文件系统驱动程序对这些操作进行排队,并在开始处理以下操作之前对每个新文件完成步骤1-7。
为了使它更加复杂,有一个日志充当中间缓冲区。您的事务被写入日志,当文件系统空闲时,文件系统驱动程序将日志事务提交到实际存储空间,但理论上保持不变。这是一个性能和可靠性问题。
您不需要在应用程序级别上担心这一点,因为所有这些都是操作系统的工作。
相反,如果在同一个目录中创建大量随机命名的文件,理论上,如果随机名称生成器生成两个相同的文件名,理论上可能会发生冲突。有一些方法可以缓解这种情况,这将是您在应用程序中需要担心的部分。但是,任何更深层次的事情都是操作系统的任务。
发布于 2018-01-10 16:01:45
发布于 2018-01-10 16:29:59
在同一个文件夹中写入不同的文件不会造成问题。当然,在Linux中,文件夹是一个文件,但您打开该文件是为了编写该文件夹,而不是该文件夹。
另一方面,使用多个进程处理同一个文件可能会导致问题,这取决于您的日志大小。有关详细信息,请参阅此问题:python日志记录支持多处理吗?
https://stackoverflow.com/questions/48191238
复制相似问题