jakie jest prawidłowe rozwiązanie, aby mieć pewność, że plik nigdy nie zostanie uszkodzony podczas korzystania z wielu wątków i procesów.równoczesne zapisywanie do tego samego pliku przy użyciu wątków i procesów
wersja do gwintów, które dbają o błędy otwierania.
lock = threading.RLock()
with lock:
try:
f = open(file, 'a')
try:
f.write('sth')
finally:
f.close() # try close in any circumstances if open passed
except:
pass # when open failed
procesów Chyba musi używać multiprocessing.Lock
ale jeśli chcę 2 procesy, a pierwszy proces własne 2 Nitki (każdy plik jeden użytku)
jest tylko teoria, ale Chcę wiedzieć, jak połączyć synchronizację z wątkami i procesami. wątki "dziedziczą" go z procesu ?, więc wymagana jest tylko synchonizacja między procesami?
i 2. Nie jestem pewien, czy powyższy kod trzeba spróbować zagnieżdżony w przypadku, gdy nie powiedzie się pisać, a my chcemy blisko otwarty plik (co, jeśli to pozostanie otwarty po zamkiem zwolniony)
Na marginesie, twoje 'try' /' finally' może (i zazwyczaj powinno) zostać zastąpione przez instrukcję 'with'. Ponadto, 'except 'pass' jest zwykle złym pomysłem - jeśli próbujesz przełknąć konkretny wyjątek, po prostu przełóż ten konkretnie, nie wszystko. Jeśli się tutaj rozejrzysz, znajdziesz dziesiątki pytań od ludzi, którzy mieli głupie błędy, jak przekazywanie int jako nazwy pliku, która nie pozwalała im na zauważanie i debugowanie. – abarnert
Ponadto, jeśli blokujesz pliki specjalnie dla plików, możesz rozważyć zastosowanie blokad plików doradczych w POSIX i wyłącznego dostępu do plików w systemie Windows, zamiast ogólnych blokad wątków/procesów. – abarnert
Inną możliwością jest wykonanie całego pliku dołączanego z jednego wątku (w jednym procesie), a wszyscy inni po prostu wysyłają wiadomości do kolejki (która nie wymaga żadnej synchronizacji, ponieważ jest wbudowana). – abarnert