Python file.read() 不返回完整内容(Flaky)



粗略地说,我连续两次调用以下函数:

def _read_bytes(path):
with open(path, "rb") as f:
print(f"f.tell() (should always be 0): {f.tell()}")
s = f.read()
print(f"f.read(): {s}")
print(f"f.tell() (should be length of file): {f.tell()}")
print(f"f.seek(0, 2) (should be length of file): {f.seek(0, 2)}")
return s

我们在CI中看到一个薄片,运行两次会产生以下输出:

# first time
f.tell() (should always be 0): 0
f.read(): b'PAR1x15x00x15x0e......' # 1109 bytes long
f.tell() (should be length of file): 1109
f.seek(0, 2) (should be length of file): 1109
# second time
f.tell() (should always be 0): 0
f.read(): b'PAR1x15x00x15x0e......' # 10585 bytes long
f.tell() (should be length of file): 10585
f.seek(0, 2) (should be length of file): 10585

第一个f.read()中的字节恰好包含第二个f.read()调用的前1109个字节。真正奇怪的是f.seek(0, 2)每次返回不同的数字。f.seek(0, 2)什么时候可以在同一个文件上返回不同的值?

详细信息:

  • Python 3.9
  • 在打开并行度的大型机器上运行Circle CI的机器ubuntu映像(8个CI节点(

我忘记了我有多个线程在写入同一个文件,所以当当前线程读取文件时,另一个线程可能已经清除了文件并部分写入了文件手掌

解决方案是使用文件锁来确保一次只有一个线程写入+读取文件。

最新更新