Ich muss eine Datei zum Schreiben in Python sperren. Auf die Datei wird von mehreren Python-Prozessen gleichzeitig zugegriffen. Ich habe im Internet einige Lösungen gefunden, aber die meisten sind für meine Zwecke ungeeignet, da sie oft nur auf Unix oder Windows basieren.
Antworten
Zu viele Anzeigen?Das hat bei mir funktioniert: Keine großen Dateien belegen, sondern in mehrere kleine aufteilen Sie erstellen Datei Temp, löschen Datei A und benennen dann Datei Temp in A um.
import os
import json
def Server():
i = 0
while i == 0:
try:
with open(File_Temp, "w") as file:
json.dump(DATA, file, indent=2)
if os.path.exists(File_A):
os.remove(File_A)
os.rename(File_Temp, File_A)
i = 1
except OSError as e:
print ("file locked: " ,str(e))
time.sleep(1)
def Clients():
i = 0
while i == 0:
try:
if os.path.exists(File_A):
with open(File_A,"r") as file:
DATA_Temp = file.read()
DATA = json.loads(DATA_Temp)
i = 1
except OSError as e:
print (str(e))
time.sleep(1)
En Szenario ist so: Der Benutzer fordert eine Datei an, um etwas zu tun. Wenn der Benutzer dann dieselbe Anforderung noch einmal sendet, wird der Benutzer darüber informiert, dass die zweite Anforderung erst nach Beendigung der ersten Anforderung ausgeführt wird. Deshalb verwende ich den Lock-Mechanismus, um dieses Problem zu lösen.
Hier ist mein funktionierender Code:
from lockfile import LockFile
lock = LockFile(lock_file_path)
status = ""
if not lock.is_locked():
lock.acquire()
status = lock.path + ' is locked.'
print status
else:
status = lock.path + " is already locked."
print status
return status
Sie finden vielleicht . sehr nützlich. Es kann zum Sperren einer Datei oder für Sperrmechanismen im Allgemeinen verwendet werden und kann von mehreren Python-Prozessen gleichzeitig aufgerufen werden.
Wenn Sie einfach nur eine Datei sperren wollen, geht das folgendermaßen:
import uuid
from pylocker import Locker
# create a unique lock pass. This can be any string.
lpass = str(uuid.uuid1())
# create locker instance.
FL = Locker(filePath='myfile.txt', lockPass=lpass, mode='w')
# aquire the lock
with FL as r:
# get the result
acquired, code, fd = r
# check if aquired.
if fd is not None:
print fd
fd.write("I have succesfuly aquired the lock !")
# no need to release anything or to close the file descriptor,
# with statement takes care of that. let's print fd and verify that.
print fd
- See previous answers
- Weitere Antworten anzeigen