Parallel processing 更糟糕的情况是:启动了一个程序的两个副本,该程序将行附加到一个文件中

Parallel processing 更糟糕的情况是:启动了一个程序的两个副本,该程序将行附加到一个文件中,parallel-processing,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行。它经常这样做,在一个循环中 我不

我有一个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
这对我来说是个问题:

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,在共享写入模式下多次打开同一文件肯定会有问题。而且,如果它们没有在共享模式下打开,您将看到其中一个抛出异常,无法打开文件

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

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中的记录,根据close的工作方式(如果它截断),如果它写入的行长度不同,那么如果行较长,您可能会得到进程B的一部分

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


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

更新:我对我的文件进行了检查,并且确实损坏了部分行(在我的问题中,“This将是我的问题”下的情况)

这是不幸的,尤其是因为它意味着即使您打算在两个进程之间共享文件,也可能会出现问题


我仍然对如何避免这种结果的任何建议感兴趣。我暂且不把一个答案标注为已被接受。(另一个答案很好,但没有提供关于这些模式或如何确定将使用哪种模式的足够详细信息。)

这将取决于系统和共享模式集。共享模式是什么意思?我正在使用Windows7。我猜你指的是某种锁,但我不知道默认行为是什么,所以这是我的问题。在windows上的python 2.x中,它应该是独占模式,这实际上意味着只能打开一个文件进行写入。退一步说,“共享模式”和“独占模式”是python级别的概念,或者操作系统级的概念?虽然我不能改变它,但我至少能弄清楚应该使用什么模式吗?