Python实现并发文件seek定位与write写入的问题咨询
Python实现并发文件seek定位与write写入的问题咨询
我正在做一个并发文件下载器,思路是分块下载文件后再合并。现在想优化这个逻辑:先创建一个和目标文件完整大小一致的预分配文件,然后让每个线程定位到对应的起始偏移量后写入对应的数据。
我搜了各种方法尝试,但都没达到预期效果,下面是我写的简化测试代码:
from random import shuffle from threading import Lock, Thread lock = Lock() def writer(i): with lock: with open("2.txt", "wb") as f: f.seek(i) f.write(f"{i}".encode("utf-8")) f.flush() def test(): # 预创建文件 with open("2.txt", "wb") as f: f.seek(7) f.write(b"\0") f.flush() # 随机顺序启动线程,模拟并发下载的场景 threads = [Thread(target = writer, args = (i, )) for i in range(8)] shuffle(threads) [t.start() for t in threads] [t.join() for t in threads] # 读取结果 with open("2.txt", "rb") as f: print(f.read()) if __name__ == "__main__": for _ in range(5): test()
我在writer函数里用wb模式打开文件,运行后得到的结果如下:
[pairman@pairface bw]$ python test.py b'\x00\x00\x00\x00\x005' b'\x00\x00\x00\x00\x005' b'\x00\x00\x00\x00\x00\x00\x007' b'\x00\x002' b'\x001'
可以看到,wb模式会覆盖已有的文件,完全不符合我的需求。
如果把wb改成ab模式,seek就完全不起作用了,线程只是在随机追加内容,结果变成这样:
[pairman@pairface bw]$ python test.py b'\x00\x00\x00\x00\x00\x00\x00\x0062045173' b'\x00\x00\x00\x00\x00\x00\x00\x0073502146' b'\x00\x00\x00\x00\x00\x00\x00\x0005432716' b'\x00\x00\x00\x00\x00\x00\x00\x0024036751' b'\x00\x00\x00\x00\x00\x00\x00\x0052046317'
所以想请教一下,有没有办法在并发场景下,实现正确打开文件、定位到指定偏移量后写入对应位置的操作呢?
备注:内容来源于stack exchange,提问作者Pairman
相关产品推荐
相关产品推荐

