gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:21 25 4
gpt4 key购买 nike

我正在尝试读取一个 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,它“巧合地”包含对相同 的引用byteschunk 一样;从那一刻起,chunk 可以被重新分配,它不会影响 list 的内容,无论 Thread 是否成功启动。

关于python - 如何正确地将字节对象传递给 Python 中的新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com