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

标签 python multithreading

我正在尝试读取一个 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/

相关文章:

c# - BlockingCollection 是线程安全的吗?

c - 互斥锁 vs 忙等待 tcp io

java - 在监视器上同步

python - 如何配置 pylint/python 来检查 MicroPython 语法?

python - PCA 分解的 k 均值簇的质心是多少?

python - 如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

python - Python 中的机器学习 : scikit-learn/Pybrain

java - java.lang.OutOfMemoryError : unable to create new native thread error using ChromeDriver and Chrome through Selenium in Spring boot

c++ - 在 C++ 中,是否可以检测线程的意外终止?

python - 通过两个单独的域访问 Django Web 应用程序