为什么我的文件在从 Python 中的多个进程写入文件时没有损坏?



,如果write()调用没有以某种方式同步,则显然,从多个进程到同一文件的编写可能会导致损坏的数据。请参阅另一个问题:Python多处理安全地写入文件。

但是,在试图将此可能的错误重现用于测试目的的同时,我无法使文件消息混合在一起。我想这样做以有效地与锁安全性进行比较。

无需做任何事情,文件似乎以某种方式受到保护。

import multiprocessing
import random
NUM_WORKERS = 10
LINE_SIZE = 10000
NUM_LINES = 10000
def writer(i):
    line = ("%d " % i) * LINE_SIZE + "n"
    with open("file.txt", "a") as file:
        for _ in range(NUM_LINES):
            file.write(line)
def check(file):
    for _ in range(NUM_LINES * NUM_WORKERS):
        values = next(file).strip().split()
        assert len(values) == LINE_SIZE
        assert len(set(values)) == 1
if __name__ == "__main__":
    processes = []
    for i in range(NUM_WORKERS):
        process = multiprocessing.Process(target=writer, args=(i, ))
        processes.append(process)
    for process in processes:
        process.start()
    for process in processes:
        process.join()
    with open("file.txt", "r") as file:
        check(file)

我正在使用linux,我也知道文件编写可能是原子的,具体取决于缓冲区的大小:unix中的文件附加原子吗?

我试图增加消息的大小,但不会产生损坏的数据。

您知道我可以使用Linux上的多处理而使用的任何代码示例?

afaiu,锁定是由内核完成的。即使您没有要求锁定的效果,您也会看到锁定的效果,这是因为默认情况下O_NONBLOCK文件状态标志是不设置的(我猜打开文件时(。

文件状态标志,尤其是请参见操作模式和man 2 fcntl

我因此修补了您的示例,以查看O_NONBLOCK的效果(实际上,断言确实失败了(:

--- 1.py.orig   2019-07-05 14:49:13.276289018 +0300
+++ 1.py        2019-07-05 14:51:11.674727731 +0300
@@ -1,5 +1,7 @@
 import multiprocessing
 import random
+import os
+import fcntl
 NUM_WORKERS = 10
 LINE_SIZE = 10000
@@ -8,6 +10,8 @@
 def writer(i):
     line = ("%d " % i) * LINE_SIZE + "n"
     with open("file.txt", "a") as file:
+        flag = fcntl.fcntl(file.fileno(), fcntl.F_GETFD)
+        fcntl.fcntl(file.fileno(), fcntl.F_SETFL, flag | os.O_NONBLOCK)
         for _ in range(NUM_LINES):
             file.write(line)

信用:请参阅例如这个和此(和/或man 3p write(。

相关内容

  • 没有找到相关文章

最新更新