我正在尝试读取一个 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
是否成功启动。
我是一名优秀的程序员,十分优秀!