粗略地说,我连续两次调用以下函数:
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节点(
我忘记了我有多个线程在写入同一个文件,所以当当前线程读取文件时,另一个线程可能已经清除了文件并部分写入了文件手掌
解决方案是使用文件锁来确保一次只有一个线程写入+读取文件。