Python 中的线程竞争条件

问题描述 投票:0回答:1

我用

backupFile
功能备份文件,我把备份的文件通过哈希添加到
hashList
中,在备份其他文件时,我通过查看
hashList
来检查之前是否备份过.我可以使用
thread
queue
同时备份多个文件,但是我得到一个
race condition
错误,因为有多个线程正在处理同一个
hashList
。我使用锁来解决这个问题,但是使用
lock = threading.Lock()
可以防止并行。当一个线程正在运行时,其他线程正在等待。这使我使用线程的目的变得毫无意义。因为我使用线程的目的是为了节省时间。

我既要使用线程又要检查之前是否备份过文件

我可能会问很多,但我需要你的想法,谢谢

我的代码;

import threading, hashlib, queue, os


def hashFile(fileName):
    with open(fileName, "rb") as f:
        sha256 = hashlib.sha256()
        while chunk := f.read(4096):
            sha256.update(chunk)
        return sha256.hexdigest()


def backupFile(q):
    while not q.empty():
        fileName = q.get()

        with lock:
            if hashFile(filesToBackupPath+fileName) in hashList:
                print(f"\033[33m{fileName} daha once yedeklenmis\033[0m")
            else:
                print(f"\033[32m{fileName} yedeklendi\033[0m")
                hashList.append(hashFile(filesToBackupPath+fileName))

        q.task_done()


filesToBackupPath = "yedeklenecekDosyalar/"
fileList = os.listdir(filesToBackupPath)
hashList = []

q = queue.Queue()

for file in fileList:
    q.put(file)

lock = threading.Lock()

for i in range(20):
    t = threading.Thread(target=backupFile, args=(q,))
    t.start()

q.join()

print('\n',len(hashList))
python multithreading algorithm queue race-condition
1个回答
0
投票

您没有理由将呼叫锁定为

hashfile
.

hash = hashFile(filesToBackupPath+fileName)

with lock:
    if hash in hashList:
         alreadyBackedUp = True
    else:
         alreadyBackedUp = False
         hashList.append(hash)

Everything else outside the lock.

访问hashList时需要锁定的

唯一
地方。
你为什么使用列表而不是集合?

© www.soinside.com 2019 - 2024. All rights reserved.