我试图读取一个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
谢谢你!你知道吗
bytes
是一个不可变的类型(就这点而言,str
)。不可变类型不受竞争条件的约束(除非您可以用对完全不同对象的引用完全替换共享名称)。你知道吗一旦你做了
args=[filename, chunk]
,你就创建了一个新的list
,它“巧合地”包含了一个与chunk
相同的bytes
引用;从那一刻起,chunk
就可以被重新分配,并且它对list
的内容没有任何影响,不管Thread
是否成功启动。你知道吗即使参数通过引用传递给新线程(因此对块的更改将显示在另一个线程中),代码也不会将写入块字节数组,每次从
f.read
引用一个新的bytes对象也很简单。因此,看起来您应该是安全的,尽管如果上传速度足够慢,您可能会立即将整个文件读入内存。你知道吗相关问题 更多 >
编程相关推荐