You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:44:32