Python - 并发文件查找和写入

问题描述 投票:0回答:1

我正在制作一个并发文件下载器,它以分段文件的形式下载并随后合并它们。我想通过预先创建一个具有整个大小的大文件来改进它,然后每个线程将寻找其相应的起始偏移量并写入。

我用谷歌搜索并尝试了不同的方法。它们都不起作用。

简化代码:

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():
    # Pre-create the file
    with open("2.txt", "wb") as f:
        f.seek(7)
        f.write(b"\0")
        f.flush()

    # Spawn and execute the threads in randomized order
    # to mimic the concurrent downloader
    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]
    # Read the result
    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'

那么有没有办法真正同时打开、查找和写入文件呢?

python multithreading file fwrite seek
1个回答
0
投票

已解决 - 使用“rb+”同时查找和写入。

© www.soinside.com 2019 - 2024. All rights reserved.