Python | Sperren ohne Deadlocks
In diesem Artikel geht es darum, wie Sie mehr als eine Sperre gleichzeitig erhalten, wenn ein Multithread-Programm bereitgestellt wird, und die Deadlocks zu vermeiden.
Multithread-Programme - Aufgrund der Threads, die immer wieder versuchen, mehrere Sperren gleichzeitig zu erhalten, sind diese sehr anfällig für Deadlocks. Ein Beispiel: Eine Sperre wurde bereits von einem Thread erworben, und dann wird vom Block eine zweite Sperre versucht. In diesem Fall kann das Programm einfrieren, da der Thread möglicherweise den Fortschritt anderer Threads blockieren kann.
Lösung:
- Durchsetzung der Bestellregel
- Zuweisen jeder Sperre auf einzigartige Weise zum Programm.
- Es können nur mehrere Sperren in aufsteigender Reihenfolge erfasst werden.
Code 1: Implementierung der Lösung mithilfe eines Kontextmanagers.
import
threading
from
contextlib
import
contextmanager
_local
=
threading.local()
@contextmanager
def
acquire(
*
lock_state_state):
lock_state_state
=
sorted
(lock_state_state, key
=
lambda
a:
id
(a))
acquired
=
getattr
(_local,
'acquired'
, [])
if
acquired
and
max
(
id
(lock_state)
for
lock_state
in
acquired) >
=
id
(lock_state_state[
0
]):
raise
RuntimeError(
'lock_state Order Violation'
)
acquired.extend(lock_state_state)
_local.acquired
=
acquired
try
:
for
lock_state
in
lock_state_state:
lock.acquire()
yield
finally
:
for
lock_state
in
reversed
(lock_state_state):
lock_state.release()
del
acquired[
-
len
(lock_state_state):]