如何在Python中将bytes对象正确地传递给新线程?

2024-05-26 19:53:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

以下是完整的方法:

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

谢谢你!你知道吗


Tags: 文件targetindexargsfilename线程threadstart
2条回答

bytes是一个不可变的类型(就这点而言,str)。不可变类型不受竞争条件的约束(除非您可以用对完全不同对象的引用完全替换共享名称)。你知道吗

一旦你做了args=[filename, chunk],你就创建了一个新的list,它“巧合地”包含了一个与chunk相同的bytes引用;从那一刻起,chunk就可以被重新分配,并且它对list的内容没有任何影响,不管Thread是否成功启动。你知道吗

即使参数通过引用传递给新线程(因此对块的更改将显示在另一个线程中),代码也不会写入块字节数组,每次从f.read引用一个新的bytes对象也很简单。因此,看起来您应该是安全的,尽管如果上传速度足够慢,您可能会立即将整个文件读入内存。你知道吗

相关问题 更多 >

    热门问题