![](/img/trans.png)
[英]How can multiple child processes write in the same shared memory dataframe in python?
[英]Can multiple processes write to the same folder?
我在Ubuntu机器上运行Python中的几个进程(使用multiprocessing.Process)。 每个进程都写入各种临时文件。 每个进程都写入不同的文件,但所有文件都在同一个文件夹中。 这里有潜在的错误风险吗?
我认为可能存在问题的原因是,AFAIK,Unix中的文件夹只是一个文件。 所以它就像几个进程同时写入同一个文件一样,这可能会导致信息丢失。 这真的是潜在的风险吗? 如果是这样,如何解决?
这与Python完全无关,因为Python中的文件操作使用操作系统级系统调用(除非以root身份运行,否则您的Python程序无权执行原始设备写入并以root身份执行它们将非常愚蠢)。
一些文件系统理论,如果有人关心阅读:
是的,如果您研究文件系统体系结构以及数据实际存储在驱动器上的方式,则文件和目录之间存在相似之处 - 但仅限于数据存储级别。 原因是没有必要将这两者分开。 例如,ext4文件系统具有存储关于文件(元数据)的信息的方法,存储在称为inode的小单元中,以及实际文件本身。 Inode包含指向可以找到文件数据的实际磁盘空间的指针。
文件系统通常与目录无关。 文件系统基本上就是这样:它包含有关可用磁盘空间的信息,有关指向数据的文件的信息以及实际数据。 元数据的一部分是文件所在的目录。 在现代文件系统中(古代FAT是仍在使用的例外)磁盘上的数据存储与目录无关。 目录用于允许人和计算机实现文件系统快速定位文件和文件夹,而不是顺序遍历inode列表,直到找到正确的文件。
您可能已经读过目录只是文件。 是的,它们是“文件”,其中包含文件列表(或实际上是树,但请不要将其与目录树混淆 - 它只是一种存储大型目录信息的机制,以便该目录中的文件可以不需要在目录条目中按顺序搜索)。 这是一个文件的原因是它是文件系统如何存储数据的机制。 不需要具有特定的数据存储机制,因为目录仅包含文件列表和指向其inode的指针。 您可以将其视为数据库,甚至更简单,即文本文件。 但最后它只是一个包含指针的文件,而不是在磁盘表面上分配的内容,以包含存储在目录中的实际文件。
那是背景。
您计算机上的文件系统实现只是一个知道如何处理所有这些的软件。 当您在某个目录中打开文件进行写入时,通常会发生以下情况:
它是操作系统和文件系统驱动程序的工作,以确保所有这一切始终发生。 实际上,它意味着文件系统驱动程序将操作排队。 同时将多个文件写入同一目录是一个例行操作 - 例如,当您浏览互联网时,Web浏览器缓存目录会以这种方式更新。 在引擎盖下,文件系统驱动程序对这些操作进行排队,并在开始处理以下操作之前为每个新文件完成步骤1-7。
为了使它更复杂,有一个日志充当中间缓冲区。 您的事务被写入日志,当文件系统空闲时,文件系统驱动程序将日志事务提交到实际存储空间,但理论保持不变。 这是性能和可靠性问题。
您无需在应用程序级别担心这一点,因为操作系统的工作就是完成所有这些工作。
相反,如果您在同一目录中创建了大量随机命名的文件,理论上如果您的随机名称生成器生成两个相同的文件名,则可能会在某些时候发生冲突。 有一些方法可以缓解这种情况,这将是您在应用程序中需要担心的部分。 但更重要的是操作系统的任务。
写入同一文件夹中的不同文件不会导致问题。 当然,文件夹是Linux中的文件,但是您打开文件而不是写入文件夹。
另一方面,根据您的日志大小,wiritng到具有多个进程的同一文件可能会导致问题。 有关更多详细信息,请参阅此问题: python日志记录是否支持多处理?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.