更糟糕的情况:启动一个程序的两个副本,它将行附加到文件

时间:2017-07-28 01:15:31

标签: parallel-processing

我有一个Python程序,它对文件执行简单的操作:

with open(self.cache_filename_url, "a", encoding="utf8") as f:
    w = csv.writer(f, delimiter=',', quotechar='"', lineterminator='\n')
    w.writerow([cache_url, rpd_products])

正如您所看到的那样,只需打开文件并为其添加CSV行。它在循环中做了很多。

我不小心同时运行了这个程序的两个副本,所以我认为他们会同时附加到该文件。我正在尝试确定文件损坏的最坏情况。

在这种情况下,您认为写入至少是原子操作吗?例如,不会对我来说是一个问题:

old line
old line
new line written by instance 1
new line written by instance 2
new line written by one

对我来说是一个问题:

old line
old line
[half of new line written by instance 1] [half of new line by instance 2]
etc

换句话说,两个追加操作是否有可能干扰"彼此?

编辑:我使用的是Windows 7

2 个答案:

答案 0 :(得分:1)

在共享写入模式下多次打开同一个文件肯定会有问题。并且,如果它们不以共享模式打开,您将获得其中一个抛出无法打开文件的异常。

如果是SHARED模式: 两个实例都有自己的内部指针。在大多数情况下,他们可能会独立编写。你可以得到:

Process A opens file, sets pointer to end (byte 1024)
Process B opens file, sets pointer to end (byte 1024)
Process B writes at byte 1024 and closes file
Process A writes at byte 1024 and closes file.

两个进程都将写入同一位置的文件。你基本上已经从进程B中丢失了记录,并且取决于关闭的工作方式(如果它被截断),如果它写的行是不同的长度,如果行更长,你可以获得进程B的一部分。

如果它处于EXCLUSIVE模式,则一个进程将无法打开该文件,并且您将启动任何异常处理。

您所处的模式可能与系统有关,因为Python似乎没有提供任何控制共享模式的机制。

答案 1 :(得分:0)

更新:我对我的文件进行了检查,确实已经损坏了部分行(在我的问题中,“对我来说是个问题”下的情况)

这很不幸,特别是因为它意味着即使您打算在两个进程之间共享文件时也会遇到问题。

我仍然对如何避免这种结果的任何指示感兴趣。我会暂时将答案标记为现在已被接受。 (另一个答案是好的,但没有提供有关这些模式的足够详细信息或如何确定将使用哪些模式。)