Skip to main content
 首页 » 编程设计

python之如何正确地将字节对象传递给 Python 中的新线程

2025年05月04日14傻小

我正在尝试读取一个 1GB 的文件,将其分成 4MB 的文件,然后使用多个线程分别上传这些文件。但是,我认为我没有正确传递“ block ”对象。我怀疑这一行可能不正确:

threading.Thread(target=UploadFile, args=[filename, chunk]).start() 

在将它作为参数传递之前,我是否需要复制“chunk”?我担心的是“ block ”在这个例子中不是线程安全的,因此,上传的 block 将与源数据不一致。

这是完整的方法:

def ChunkAndUpload(inputFilename): 
    global runningThreadCount 
    maxThreads = 10 
    chunkSize = 1024*1024*4 
    index = 0 
    with open(inputFilename, "rb") as f: 
        while True: 
            chunk = f.read(chunkSize) 
            if not chunk: break 
            filename = str(index) + ".dat" 
            while (True): 
                if (runningThreadCount<maxThreads): 
                    runningThreadCount += 1 
                    threading.Thread(target=UploadFile, args=[filename, chunk]).start() 
                    break 
                else: 
                    sleep(.1) 
            index+=1 

谢谢!

请您参考如下方法:

bytes 是一种不可变类型(就此而言,str 也是)。不可变类型不受竞争条件的影响(除非您可以将共享名称完全替换为对完全不同对象的引用)。

一旦您执行 args=[filename, chunk],您就创建了一个新的 list,它“巧合地”包含对相同 的引用bytes 和 chunk 一样;从那一刻起,chunk 可以被重新分配,它不会影响 list 的内容,无论 Thread 是否成功启动。