我用
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))
您没有理由将呼叫锁定为
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
时需要锁定的
唯一地方。